Micronaut GraphQL:如何从 GraphQL 处理程序中使用非 200 HTTP 状态代码进行响应?

Micronaut GraphQL: How to respond with a non-200 HTTP status code from within GraphQL handler?

按照文档,这是我的异常处理程序 (Kotlin):

@Produces
@Singleton
@Requirements(Requires(classes = [ForbiddenException::class, ExceptionHandler::class]))
class ForbiddenExceptionHandler : ExceptionHandler<ForbiddenException, HttpResponse<*>> {
    override fun handle(request: HttpRequest<*>, exception: ForbiddenException): HttpResponse<*> {
        return HttpResponse.status<String>(HttpStatus.FORBIDDEN, exception?.message)
    }
}

从我的 GraphQL 处理程序中抛出 ForbiddenException 会将消息冒泡到响应正文中,但状态代码始终为 200。

示例响应:

{
  "errors": [
    {
      "message": "Exception while fetching data (/createUser) : FORBIDDEN",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "createUser"
      ],
      "extensions": {
        "classification": "DataFetchingException"
      }
    }
  ],
  "data": null
}

Micronaut 版本:1.3.3 Micronaut GraphQL 版本:1.3.0.RC1

免责声明: GraphQL 不是 REST。您在这里提出的问题与 graphql 规范的核心基础(以及任何 graphql 的一般实现)有关。

他们选择嵌入在执行查询时遇到的大多数错误,但始终 return 200 HTTP 状态。因此,您将无法在您的项目中更改它。不是graphql的配置-java.

好消息是错误的格式是已知的。因此,您可以反序列化应用程序中的错误 return 负载,并正确处理 graphql 抛出的任何错误。

请查看 this link 以深入了解 REST 和 Graphql 之间的主要区别。