【发布时间】:2020-04-30 22:27:33
【问题描述】:
很多资源都说,GraphQL 应该始终以 200 状态码响应,即使发生错误:
- https://www.graph.cool/docs/faq/api-eep0ugh1wa/#how-does-error-handling-work-with-graphcool
- https://github.com/rmosolgo/graphql-ruby/issues/1130#issuecomment-347373937
- https://blog.hasura.io/handling-graphql-hasura-errors-with-react/
因为 GraphQL 可以在一个响应中返回多个响应,所以这是有道理的。当用户在一个请求中请求两个资源并且只能访问第一个资源时,您可以发回第一个资源并为第二个资源返回 forbidden 错误。
但是,这只是我在阅读多个 GraphQL 库的文档和博客文章的过程中发现的。 我在https://spec.graphql.org/ 或https://graphql.org/ 的官方规范中没有找到任何关于 HTTP 状态代码的信息
所以我还有几个问题:
- 如果我遇到意外的服务器错误,是否可以返回 HTTP 500 状态代码?
- 如果凭据错误,是否可以返回 HTTP 401 状态代码?
- 我是否应该像这样在 GraphQL 响应的
errors键中包含 潜在 HTTP 状态代码
{
"errors" => [{
"message" => "Graphql::Forbidden",
"locations" => [],
"extensions" => {
"error_class" => "Graphql::Forbidden", "status" => 403
}
}]
}
- 我是否应该将字段名称错误等常见错误与 HTTP 状态代码
400 Bad Request匹配?
{
"errors" => [{
"message" => "Field 'foobar' doesn't exist on type 'UserConnection'",
"locations" => [{
"line" => 1,
"column" => 11
}],
"path" => ["query", "users", "foobar"],
"extensions" => {
"status" => 400, "code" => "undefinedField", "typeName" => "UserConnection", "fieldName" => "foobar"
}
}]
}
如果您能在 GraphQL 中处理 HTTP 状态代码时分享您的经验/资源/最佳实践,我会非常棒。
【问题讨论】: