Пользовательский код состояния ошибки с помощью 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.