Изменение кода ответа при сбое проверки параметров запроса с помощью Swagger 2.0

Я использую Apigee 127 поверх Swagger для создания REST API.

Это глава файла конфигурации swagger.yaml:

swagger: 2.0
info:
  version: "0.0.1"
  title: LMS API Gateway
# during dev, should point to your local machine
host: localhost
# basePath prefixes all resource paths 
basePath: /
# 
schemes:
  # tip: remove http to make production-grade
  - http
  - https
# format of bodies a client can send (Content-Type)
consumes:
  - application/json
# format of the responses to the client (Accepts)
produces:
  - application/json
x-a127-config: {}
x-volos-resources: {}
paths:
  /lms/oauth2/token:
    # binds a127 app logic to a route
    x-swagger-router-controller: authentication
    x-volos-authorizations: {}
    x-volos-apply: {}
    post:
      description: Authenticates a user
      operationId: authenticate
      parameters:
        - name: body
          in: body
          description: The JSON request body
          required: true
          schema: 
            $ref: AuthenticationRequest
      responses:
        "200":
          description: Success
          schema:
            $ref: AuthenticationResponseSuccess
        default:
          description: Error
          schema:
            $ref: AuthenticationResponseError

Тогда у меня есть это AuthenticationRequest Объект схемы, который описывает, каким должно быть тело запроса на аутентификацию. Все идет нормально.

Когда я делаю правильный запрос, он работает нормально, но когда я делаю неправильный запрос, я получаю следующий ответ:

HTTP/1.1 500 Internal Server Error
X-Powered-By: Express
X-Content-Type-Options: nosniff
Content-Type: text/html; charset=utf-8
Content-Length: 60
Date: Mon, 06 Oct 2014 16:31:08 GMT
Connection: keep-alive

Parameter (body) is not a valid AuthenticationRequest model

Не было бы проблем с этим, если бы в моей спецификации API не было указано, что я ДОЛЖЕН вернуть 400 Bad Request Код ответа для неверного запроса (что, кстати, имеет больше смысла).

Так что проблема в том, что я не смог найти способ изменить это поведение в документах Swagger.

Кто-нибудь?

1 ответ

Решение

Он работает как задумано прямо сейчас. Путь swagger-validator работает, он просто передаст ошибку следующему промежуточному программному обеспечению, и в этом случае, если отсутствует промежуточное программное обеспечение для обработки этого, вы получите 500, (См. Swagger-validator.js # L119). Причина, по которой это происходит таким образом, заключается в том, чтобы позволить автору приложения перехватить это в случае необходимости. Это было сделано специально, но я могу видеть, как кто-то может захотеть, чтобы промежуточное ПО отправляло ответ, но правильное выполнение этого может быть проблемой, когда речь идет о типах контента (JSON против XML против HTML против. ..) и структуре (Какова действительная структура ошибки?).

Чтобы все работало так, как вы хотите, вам нужно добавить промежуточное программное обеспечение для обработки ошибок, которое соответствующим образом отформатирует ответ и его код состояния. В зависимости от вашего сервера (подключение, экспресс и т. Д.) Порядок действий может немного измениться.

Если вы считаете, что swagger-tools должны предоставить средства для этого, не стесняйтесь сообщать о проблеме как можно больше информации о том, как вы хотите, чтобы это работало.

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