在发生异常时使用服务抛出的不同代码覆盖 GraphQL 默认状态代码(200)

Posted

技术标签:

【中文标题】在发生异常时使用服务抛出的不同代码覆盖 GraphQL 默认状态代码(200)【英文标题】:Override GraphQL Default Status Code(200) With Different Code Thrown By Service In Case Of Exception 【发布时间】:2021-03-14 18:47:54 【问题描述】:

我在 SpringBoot 之上构建了一个微服务,并且我将 GraphQL 用于微服务。默认情况下,GraphQL 会发送 200 状态代码,即使它的错误和错误详细信息作为响应的错误部分的一部分出现。

但我想在交易不成功并被服务抛出异常时发送不同的状态码。

我怎样才能做到这一点?有人可以帮我吗?

我当前的自定义异常类是 GraphQLError 类型。

提前致谢

【问题讨论】:

【参考方案1】:

根据 GraphQL standards,任何错误都应该在 error 块中返回,所以你应该返回状态码,错误块中的消息

响应中的错误条目是一个非空错误列表,其中每个错误都是一个映射。

如果在请求的操作过程中没有遇到错误,则错误条目不应出现在结果中。

如果响应中的数据条目不存在,则响应中的错误条目不能为空。它必须包含至少一个错误。它包含的错误应该表明为什么无法返回数据。

如果响应中的数据条目存在(包括其值为 null),则响应中的错误条目可能包含执行期间发生的任何错误。如果在执行过程中发生错误,它应该包含这些错误。


   "errors": [
       
           "message": "error message",
           "path": "/api/call",
           "status_code": 500
       
   ],
    "data": null

【讨论】:

我了解 GraphQL 标准,但我的问题是,如果出现异常,我可以用服务抛出的状态码覆盖默认状态码吗? 我会说你不应该这样做,我不确定是否有办法做到这一点@DebapriyaPatra

以上是关于在发生异常时使用服务抛出的不同代码覆盖 GraphQL 默认状态代码(200)的主要内容,如果未能解决你的问题,请参考以下文章

Java 覆盖

Mockito 如何模拟和断言抛出的异常?

如何捕获ctypes中抛出的异常?

TestCases 如何测试抛出的不同异常?

WCF异常处理

异常捕获