使用gqlgen + go gin自定义错误状态代码

pxq42qpu  于 2023-10-14  发布在  Go
关注(0)|答案(1)|浏览(136)

最近我一直在更新我的GO REST API到graphQl API's,我遇到了一个问题,我无法使用gqlgen自定义我的状态代码。
我得到的回应
报头

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

预期标题

Status Code: 401 UNAUTHORISED

任何帮助将是真正的感激!

8i9zcol2

8i9zcol21#

假设你有一个类似于下面的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状态码

gqlgendocs on authentication包含一个返回401状态代码的示例。
为什么?这发生在一个http处理程序中,它被用作chi http服务器上的中间件。401状态码是由GraphQL解析器返回的。

相关问题