Изменение кода ответа при сбое проверки параметров запроса с помощью 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 должны предоставить средства для этого, не стесняйтесь сообщать о проблеме как можно больше информации о том, как вы хотите, чтобы это работало.