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

问题描述

最近我已经将我的GO REST API更新为graphQl API's,但遇到了无法使用gqlgen自定义状态代码的问题。

我得到的答复

标题

$: v=$( echo "dGVzdA==" | base64 -d )
$: my_array=( $( for(( i=0; i<${#v}; i++ )); do echo "${v:i:1}"; done ) )
$: echo ${my_array[2]}
s
base64

期望的标题

Status Code: 200 OK

任何帮助都会非常感激!

解决方法

假设您有一个类似于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 docs on authentication包含一个示例 返回401状态代码的地方。

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