如何使用 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 上下文中有效实现这一点的指导都将受到高度赞赏!
谢谢!
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)。