Micronaut GraphQL: Как ответить с помощью кода состояния HTTP не из 200 из обработчика GraphQL? - PullRequest
1 голос
/ 03 апреля 2020

Следуя документации и вот мой обработчик исключений (Kotlin):

@Produces
@Singleton
@Requirements(Requires(classes = [ForbiddenException::class, ExceptionHandler::class]))
class ForbiddenExceptionHandler : ExceptionHandler<ForbiddenException, HttpResponse<*>> {
    override fun handle(request: HttpRequest<*>, exception: ForbiddenException): HttpResponse<*> {
        return HttpResponse.status<String>(HttpStatus.FORBIDDEN, exception?.message)
    }
}

Создание ForbiddenException из моего обработчика GraphQL превращает сообщение в тело ответа, но код состояния всегда 200.

Пример ответа:

{
  "errors": [
    {
      "message": "Exception while fetching data (/createUser) : FORBIDDEN",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "createUser"
      ],
      "extensions": {
        "classification": "DataFetchingException"
      }
    }
  ],
  "data": null
}

Версия Micronaut: 1.3.3 Версия Micronaut GraphQL: 1.3.0.RC1

1 Ответ

1 голос
/ 03 апреля 2020

Отказ от ответственности : GraphQL не является REST. Вы здесь задаете вопрос, связанный с ядром спецификации graphql (и любых реализаций graphql в целом).

Они сделали выбор встраивать большинство ошибок, возникающих при выполнении запросов, но при этом всегда возвращают 200 HTTP статус. Поэтому вы не сможете изменить это в своем проекте. Это не конфигурация graphql- java.

Хорошая новость заключается в том, что формат ошибок известен. Таким образом, вы можете десериализовать полезную нагрузку возврата ошибок в вашем приложении и правильно обработать любую ошибку, которая будет выдана graphql.

Пожалуйста, посмотрите на эту ссылку для подробных объяснений. о главном различии между REST и Graphql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...