如何在 FastAPI GraphQL API 中实现特定状态代码的错误处理

问题描述 投票:0回答:1

如何使用 FastAPI 和 Strawberry 处理 GraphQL API 中状态代码(404、422、500、401 和 403)的错误?

我正在使用 FastAPI 和 Strawberry 开发 GraphQL API,我需要实现强大的错误处理,根据不同的错误场景返回适当的 HTTP 状态代码。具体来说,我想处理以下状态代码:

404 Not Found:针对找不到的资源。 422 Unprocessable Entity:输入数据不正确时出现验证错误。 500 内部服务器错误:用于意外的服务器错误。 401 Unauthorized:针对需要认证但未认证的请求。 403 Forbidden:针对已通过身份验证但无权访问资源的请求。

任何关于使用 Strawberry 在 GraphQL 上下文中有效实现这一点的指导都将受到高度赞赏!

谢谢!

python-3.x error-handling graphql strawberry-graphql fastapiusers
1个回答
0
投票

HTTP 状态代码通常用于基于 HTTP 协议的 REST API。对于与传输无关的 GraphQL,使用 HTTP 状态代码来处理错误并不总是有意义。更多详情,您可以参考这个答案

关于您关于 Strawberry 和 FastAPI 的具体问题,您可以在 GraphQL 规范内返回正确的错误响应,而不是依赖 HTTP 状态代码。 GraphQL 中的

extensions
属性允许您在响应对象中包含自定义错误代码。 请参考这个答案

这是使用 Strawberry 的 GraphQL 实现示例:

import strawberry
from graphql import GraphQLError
from typing import Optional

@strawberry.type
class Dummy:
    id: Optional[str] = None

@strawberry.type
class Query:
    @strawberry.field
    async def dummyQuery(self, info, id: strawberry.ID) -> Optional[Dummy]:
        if id == 'Error':
            raise GraphQLError(
                "Authorization failed",
                extensions={"error_code": "405"}
            )
        return Dummy(id="Valid response")

现在,如果您在 GraphiQL 中发出以下 GraphQL 请求,其中包括两个查询:

{
  firstQuery: dummyQuery(id: "hello") {
    ... on Dummy {
      id
    }
  }
  secondQuery: dummyQuery(id: "Error") {
    ... on Dummy {
      id
    }
  }
}

您将得到以下响应,其中一个查询返回错误对象,而另一个查询返回正确的响应:

{
  "data": {
    "firstQuery": {
      "id": "Valid response"
    },
    "secondQuery": null
  },
  "errors": [
    {
      "message": "Authorization failed",
      "locations": [
        {
          "line": 7,
          "column": 3
        }
      ],
      "path": [
        "secondQuery"
      ],
      "extensions": {
        "error_code": "405"
      }
    }
  ]
}

此方法遵循 GraphQL 标准。但是,如果您确实需要返回特定的 HTTP 状态代码,则可以通过使用

response
:
 修改解析器中的 
info.context

对象来实现此目的
@strawberry.type
class Query:
    @strawberry.field
    async def dummyQuery(self, info, id: ID) -> Optional[Dummy]:
        if id == 'Error':
            info.context["response"].status_code = 403
            raise GraphQLError("Authorization failed", extensions={"error_code": "405"})
        return Dummy(id="Valid response")

这允许您在 GraphQL 错误响应旁边设置自定义 HTTP 状态代码(例如 403)。

© www.soinside.com 2019 - 2024. All rights reserved.