Пользовательский код состояния ошибки с помощью gqlgen + go gin

Недавно я обновлял свои API-интерфейсы GO REST до API-интерфейсов graphQl и столкнулся с проблемой, при которой я не могу настроить свой код состояния с помощью gqlgen.

Ответ я получил

Заголовки

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

Ожидаемый заголовок

Status Code: 401 UNAUTHORISED

Любая помощь будет очень признательна!

1 ответ

Предположим, у вас есть 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.

Почему? Это происходит в обработчике http, используемом в качестве промежуточного программного обеспечения на сервере chi http. Код состояния 401 не возвращается преобразователем GraphQL.

Другие вопросы по тегам