当前位置: 首页 > 知识库问答 >
问题:

如何在GraphQL SPQR中设置标题变量

宇文智敏
2023-03-14

我正在使用GraphQL SPQR和Spring Boot运行GraphQL API。

目前,我正在抛出RuntimeExceptions以返回GraphQL错误。我有一个CustExceptionHandler,它实现了DataFetcherExceptionHandler,以正确的格式返回错误,如下所示:

class CustomExceptionHandler : DataFetcherExceptionHandler {
    override fun onException(handlerParameters: DataFetcherExceptionHandlerParameters?): DataFetcherExceptionHandlerResult {


        // get exception
        var exception = handlerParameters?.exception
        val locations = listOf(handlerParameters?.sourceLocation)
        val path = listOf(handlerParameters?.path?.segmentName)

        // create a GraphQLError from your exception
        if (exception !is GraphQLError) {
            exception = CustomGraphQLError(exception?.localizedMessage, locations, path)
        }

        // cast to GraphQLError
        exception as CustomGraphQLError

        exception.locations = locations
        exception.path = path

        val errors = listOf<GraphQLError>(exception)

        return DataFetcherExceptionHandlerResult.Builder().errors(errors).build()
    }
}

我使用CustomExceptionHandler如下(在我的主应用程序类中):

@Bean
    fun graphQL(schema: GraphQLSchema): GraphQL {
        return GraphQL.newGraphQL(schema)
                .queryExecutionStrategy(AsyncExecutionStrategy(CustomExceptionHandler()))
                .mutationExecutionStrategy(AsyncSerialExecutionStrategy(CustomExceptionHandler()))
                .build()
    }

更好的是,是否可以创建一个Spring Bean,将UUID放在所有查询和突变的头中?

谢谢

共有1个答案

糜宜民
2023-03-14

使用spring boot时,有两种选择:

  • 您使用的是spring boot graphql spqr启动器(它提供了自己的控制器来处理所有graphql请求)

无论如何,你有几个选择:

这可能是最简单的方法——而且在任何情况下都可能有效:您可以简单地将CustomExceptionHandler设为Spring bean并让它自动连接HttpServletRequest——在处理程序方法中,您可以将其设置为您想要的任何内容。这是Java中的一些虚拟代码(抱歉,我对静态编程语言不够精通):

@Component
class CustomExceptionHandler implements DataFetcherExceptionHandler {
    private final HttpServletResponse response; 

    public CustomExceptionHandler(HttpServletResponse response) {
        this.response = response; 
    }

    @Override
    public DataFetcherExceptionHandlerResult onException(DataFetcherExceptionHandlerParameters handlerParameters) {
        response.setHeader("X-Request-ID", UUID.randomUUID().toString());
        // ... your actual error handling code
    }
}

这将起作用,因为Spring会意识到HttpServletRequest对于每个请求都不同。因此,它将向您的错误处理程序注入一个动态代理,该代理将指向每个请求的实际HttpServletACK实例。

我认为,这不是最优雅的方式,但它肯定会解决你的问题。

在使用此启动器的项目中使用了一个默认控制器实现。该控制器将处理您收到的每个图形化请求。您可以通过实现自己的GraphQLExector并将其设为Spring bean来自定义它。该执行器负责调用GraphQL引擎,将参数传入并输出响应。这是默认实现,您可能希望将其作为工作的基础。

与前面的解决方案类似,您可以在该类中自动连接HttpServletResponse,并设置HTTP响应头。

该解决方案将允许您决定是在所有情况下设置请求ID,还是仅在特定的错误情况下设置。(graphql.execute返回一个对象,您可以从中获取是否存在错误以及存在哪些错误的信息)

找到GraphQL控制器,向HttpServletRequest类型的方法添加一个参数,然后根据需要向该方法添加头(请参阅前一节中的一些更具体的建议)

 类似资料:
  • 当我从数据帧绘图时。我可以调整标题的字体大小吗?可能是将列表/字典传递给参数而不是字符串?基本上,我不知道如何将函数集成到中。

  • 问题内容: 我在Go中做一个简单的http GET: 但是我找不到在doc中自定义请求标头的方法,谢谢 问题答案: 请求的字段是公共的。您可以这样做:

  • 我有以下标题 这是抛出一个例外,而当我从邮递员那里做同样的事情时,它是有效的。奇怪的是,当我从我的应用程序运行这个时,我只在选项中出错,也就是说,甚至我的调用都没有被调用,我在我的响应中看不到任何标题。 有人能建议我帮忙吗?谢谢。

  • 问题内容: 我想为我的React应用程序设置文档标题(在浏览器标题栏中)。我已经尝试使用反应文档标题(似乎过时了),并设置在与这些解决方案的工作- 。 问题答案: 您可以使用React Helmet:

  • 这是我的代码: 但是,当我从浏览器向服务器发出请求时,会出现以下错误: 我也尝试过这种方法,在请求之后设置响应头: 没有骰子。我得到同样的错误。有没有办法只在路由函数中设置响应头?像这样的东西是理想的: 但是我无论如何也找不到这样做。请帮忙。 编辑 如果我卷曲的url与POST请求这样: 我得到的答复是: 有什么想法吗?

  • 问题内容: 我将Xcode 6用于带有Swift的iOS应用。我有一个带有嵌入式UIWebView的简单ViewController。您可以在下面找到代码。现在,我想更改HTTP标头。我尝试使用的方法,但没有用(请参见未注释的行)。有谁知道这是怎么做到的吗? 问题答案: 这将更改通过“正常”堆栈进行的任何呼叫的代理。 斯威夫特2: 斯威夫特3: