【问题标题】:How can i access request headers in graphql query using java datafetcher environment?如何使用 java datafetcher 环境访问 graphql 查询中的请求标头?
【发布时间】:2022-09-26 01:25:10
【问题描述】:

我想获取在 GraphQl 查询调用期间传递的标头值。在休息 api 的情况下,我们可以事先做一些事情 HttpServletRequest.getheader()

我想从 dataFetchingEnvironment 中获取它,但是从这个值中获取的上下文没有让我有任何方法从请求中获取标头值。

        try {
            GraphQLContext context =  env.getGraphQlContext();
            String Id= context.getHeader(\"headerkeyIpass\"); 
// I know this method does not exist i am trying to paint a picture as to what i am asking

我不打算更改解析器方法调用,但任何改进我的代码的输入都会很棒。

    标签: java spring spring-boot graphql graphql-java


    【解决方案1】:

    GraphQLContext 有方法 getHttpServletRequest() 返回

    java.util.Optional<javax.servlet.http.HttpServletRequest> 
    

    所以从那里你可以得到标题

    GraphQLContext context =  env.getGraphQlContext();
    HttpServletRequest request = context.getHttpServletRequest().get();
    String Id= request.getHeader("headerkeyIpass"); 
    

    如果您使用最新的graphql libraries,则有一些重大更改,您可以从GraphQLServletContext 获取标头,如图here

    GraphQLServletContext graphQLServletContext = (GraphQLServletContext) env.getContext();
        
    String user = graphQLServletContext.getHttpServletRequest().getHeader("user");
    

    【讨论】:

    • 我确实使用下面的代码来获取标题值``` GraphQLServletContext context = env.getContext(); HttpServletRequest 请求=context.getHttpServletRequest(); String Id=request.getHeader("headerkeyIpass"); ``` 但是不推荐使用DataFetcherEnvironement.getContext 上面的代码HttpServletRequest request = context.getHttpServletRequest().get();不起作用,因为 GraphQLContext 不存在 getHttpServletRequest 但 GraphQLServletContext 确实有。现在我们可以从 DataFetching 环境中获取 GraphQLServletContext 了吗?
    【解决方案2】:

    就像你说的 getHttpServletRequest 在使用新的官方 Spring 2.7 spring-boot-starter-graphql(不是 legacy GraphQL Java Kickstart 的)时在 DataFetchingEnvironment.getGraphQlContext() 上不存在。

    相反,您可以在控制器顶部添加一个自动连接的HttpServletRequest 请求变量,在每个查询解析器中,它将填充请求上下文。

    @Controller
    public class SomeGraphQLController {
        ...
    
        @Autowired
        private HttpServletRequest request; // will be filled inside each @QueryResolver and @MutationResolver method.
    
        ...
    
        @QueryResolver
        public XXX yyyy() {
            ...
            try {
                String someHeader = request.getHeader("someHeader"); 
            ...
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-21
      • 2020-06-23
      • 2020-10-01
      • 2016-08-08
      • 1970-01-01
      • 2019-10-25
      • 2021-07-09
      • 2014-02-15
      相关资源
      最近更新 更多