我正在使用GraphQL SPQR和Spring Boot运行GraphQL API。
目前,我正在抛出RuntimeException
s以返回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放在所有查询和突变的头中?
谢谢
使用spring boot时,有两种选择:
无论如何,你有几个选择:
这可能是最简单的方法——而且在任何情况下都可能有效:您可以简单地将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: