1

最近我一直在将我的 GO REST API 更新为graphQl API,我遇到了无法使用 gqlgen 自定义状态代码的问题。

我得到的回应

标头

Status Code: 200 OK
{ 
data: null,
errors: [
  {message: "Unauthorized access", path: ["..."]}
]
}

预期的标题

Status Code: 401 UNAUTHORISED

任何帮助都会非常感激!

4

1 回答 1

2

假设您有一个gqlgen类似的解析器:

func (r *queryResolver) SecretItems(ctx context.Context, userID string,
password string) ([]SecretItems, error) {
        ...
        if !isAuthorized(userID, password) {
                return nil, errors.New("Unauthorized access")
        }
        ...
}

那么所描述的行为是预期的。错误应作为响应正文的一部分返回。

GraphQL 与传输无关。虽然它通常通过 HTTP 提供服务,但也可能通过其他客户端-服务器协议提供服务。处理响应正文中的错误不需要对协议进行任何假设。因此,您不应该依赖 HTTP 状态代码。

处理响应正文中的错误还有另一个优点:假设一个请求包含多个查询。他们中的一些人成功了,一些人失败了。然后响应可以包含下成功查询的结果data和下失败查询相关的错误errors

参考:

您期望 401 状态代码的可能原因

有关身份验证的gqlgen 文档包含一个返回 401 状态代码的示例。

为什么?这发生在chi http 服务器上用作中间件的 http 处理程序中。GraphQL 解析器返回401 状态代码。

于 2020-09-24T07:46:16.597 回答