【问题标题】:Micronaut GraphQL: How to respond with a non-200 HTTP status code from within GraphQL handler?Micronaut GraphQL:如何使用 GraphQL 处理程序中的非 200 HTTP 状态代码进行响应?
【发布时间】:2020-07-15 09:33:41
【问题描述】:

按照文档,这是我的异常处理程序 (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 micronaut graphql-java


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 知道了。谢谢!我必须说,这很奇怪,但至少不提供选项。我这样做的主要动机是,由于 Micronaut 倾向于与 Spring Boot 实现功能对等,而且我可以从 Spring Boot GraphQL 解析器中抛出非 200 的值并让它冒泡,所以我想我也期待同样的结果。跨度>
    猜你喜欢
    • 2020-04-30
    • 2017-08-13
    • 2021-10-21
    • 2016-01-24
    • 2018-06-04
    • 1970-01-01
    • 2018-10-01
    • 2023-02-08
    • 1970-01-01
    相关资源
    最近更新 更多