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

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