Схема или значение возвращаемого значения в compojure-api
compojure-api позволяет определить return
схема:
(s/defschema Pizza
{:name s/Str})
(GET "/pizza/:id" [id]
:return Pizza
:summary "returns a Pizza"
(ok (get-pizza id)))
Моя проблема, когда get-pizza
FN возвращает 404 {:status 404 :body {:message "Invalid id provided"}}
ответ (запрашивающей стороне) заключается в том, что 404 не соответствует Pizza
схема:
{
"errors": {
"name": "missing-required-key",
"status": "disallowed-key",
"body": "disallowed-key"
}
}
Документы показывают, что вы можете предоставить несколько схем ответов, но мне неясно, какие у меня get-pizza
fn должен вернуться, чтобы использовать эти схемы. Их пример использует lib ring-http-response для генерации возвращаемых значений, но нет разницы между моим возвращаемым значением для get-pizza
и ring-http-response 'not found' fn.
Честно говоря, я бы предпочел не использовать :responses
Параметр, если это возможно, потому что я уже могу предвидеть все дублирование кода. Прежде чем указывать :return
Схема у меня получилась get-pizza
fn вернет 404 и будет правильно передан запрашивающей стороне, но как только я добавил схему, я больше не мог этого делать. Я считал, что возвращаемое значение будет :return (s/one Pizza Error)
где Error
будет общая карта ошибок, но я не понимаю, почему я сделал бы это для каждого маршрута, если все вызовы теоретически могут возвращать 500.
Примечание: причина, по которой я переключился на использование :return
Param в том, что он делает созданные документы Swagger-UI гораздо красивее и легче для понимания.
1 ответ
Я полагаю, у вас есть небольшая проблема в вашем коде, поскольку вы не показали реализацию своего get-pizza [id]
функция.
Вы возвращаетесь {:status 404 :body {:message "Invalid ID provided}}
который затем оборачивается в ответ HTTP 200 (ok (get-pizza id))
,
Ваш get-pizza
Функция должна вернуть пиццу или ноль, если не найден. Ваш HTTP-ответ должен быть сгенерирован на основе вашего маршрута:
(GET "/:id" []
:path-params [id :- Long]
:return Pizza
:summary "Gets a pizza"
(if-let [pizza (get-pizza id)]
(ok pizza)
(not-found {:message "Invalid ID provided"})))
Исходный пример из репозитория compojure-api имеет несколько иную реализацию, где для nil
значения из get-pizza
он все равно вернет ответ HTTP 200 с пустым телом ответа. В соответствии с вашим вопросом вы должны вернуть 404, а приведенный выше код должен соответствовать вашему требованию.