У меня есть приложение весенней загрузки, работающее с конечной точкой graphql, которая проверяет и выполняет запросы и мутации, однако мне нужно прочитать один заголовок во входящем сообщении, чтобы передать его значение в другую конечную точку. Есть ли способ в graphql прочитать эти значения? какой-то getHeaders или что-то в этом роде?
я использую весеннюю загрузку GraphQL Starter и зависимость Maven от graphql-java-tools, мне просто нужно было реализовать класс GraphQLMutationResolver




Сам GraphQL не определяет никаких вещей, связанных с тем, как выставить его по сети, поэтому он не определяет никаких вещей, связанных с получением HTTP-заголовка. Разработчики должны использовать свои способы. Таким образом, это зависит от базовых технологий, которые вы используете. для обслуживания GraphQL через HTTP.
Предположим, вы используете graphql-весна-загрузка и graphql-java-tools, и если вы не настраиваете GraphQLContext, вы можете попробовать добавить аргумент DataFetchingEnvironment в свою функцию распознавателя, а затем получить от нее GraphQLContext. Затем вы можете получить HttpServletRequest из контекста и получить доступ к заголовкам:
public Foo resolveFoo(Map<String,String> input , DataFetchingEnvironment env){
GraphQLContext context = env.getContext();
HttpServletRequest request = context.getHttpServletRequest().get();
request.getHeader("content-type");
}
Большое тебе спасибо! Сработало отлично, это было как раз то, что мне нужно было сделать
env.getContext() возвращает для меня значение null. Я использую его в DataFetcher. Не могли бы вы помочь?
Решение @Ken Chan у меня не сработало. GraphQLContext не имеет метода с именем getHttpServletRequest.
Решил это, используя вместо этого GraphQLServletContext. Вы можете изменить код на:
public Foo resolveFoo(Map<String,String> input , DataFetchingEnvironment env){
GraphQLServletContext context = env.getContext();
String header = context.getHttpServletRequest().getHeader("content-type");
}
По-видимому, тип контекста не стандартизирован. Я использую SPQR, и в моем случае я обнаружил (через отладку):
DefaultGlobalContext<ServletWebRequest> context = handlerParameters.getDataFetchingEnvironment().getContext();
context.getNativeRequest().getHeader("something");
Google принес мне этот ответ, и, к сожалению, он был для среды Spring. Многие используют среду Spring, но если вы используете Apache Tomcat с интеграцией GraphQL, как я, вы можете использовать это.
graphql.kickstart.servlet.context.DefaultGraphQLServletContext.DefaultGraphQLServletContext context = dataFetchingEnvironment.getContext();
jakarta.servlet.http.HttpServletRequest request = context.getHttpServletRequest();
String tokenBearer = request.getHeader("Authorization");
hth
Не прямой ответ на ваше заявление о проблеме, но можно использовать фильтр для его обработки до того, как запрос попадет в конечные точки распознавателя (если это требуется):
public class HeaderFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) {
final HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String headerVal= httpServletRequest.getHeader("<header string>");
try {
filterChain.doFilter(httpServletRequest, servletResponse);
} catch (IOException | ServletException e) {
//handle as you wish
}
}
Зависит от того, как вы предоставляете GraphQL через HTTP. Вы раскрываете его с помощью сервлета, Spring MVC или других библиотек?