Как читать заголовки запросов из входящего сообщения в конечной точке graphQL в весеннем загрузочном приложении

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

Зависит от того, как вы предоставляете GraphQL через HTTP. Вы раскрываете его с помощью сервлета, Spring MVC или других библиотек?

Ken Chan 25.01.2019 21:29

я использую весеннюю загрузку GraphQL Starter и зависимость Maven от graphql-java-tools, мне просто нужно было реализовать класс GraphQLMutationResolver

Juan Jose Villalobos 25.01.2019 21:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
2
4 628
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Сам 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");
    }

Большое тебе спасибо! Сработало отлично, это было как раз то, что мне нужно было сделать

Juan Jose Villalobos 28.01.2019 21:28

env.getContext() возвращает для меня значение null. Я использую его в DataFetcher. Не могли бы вы помочь?

Arjun Nayak 09.04.2021 15:26

Решение @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
    }
}

Другие вопросы по теме