【发布时间】:2016-06-07 16:58:42
【问题描述】:
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"
}
}
docs 表明您可以提供多个响应模式,但我不清楚我的get-pizza fn 应该返回什么以利用这些模式。他们的示例使用 ring-http-response 库生成返回值,但我的 get-pizza 和 ring-http-response 'not found' fn 的返回值没有区别。
说实话,如果可能的话,我宁愿不使用:responses 参数,因为我已经可以预见到所有的代码重复。在指定 :return 架构之前,我能够让我的 get-pizza fn 返回 404 并正确传递给请求者,但是一旦我添加了架构,我就无法再这样做了。我考虑让返回值为:return (s/one Pizza Error),其中Error 将是一个通用定义的错误映射,但我不明白为什么我会为 every 路由执行此操作,如果理论上所有调用都可以返回500.
注意:我改用 :return 参数的原因是它使生成的 swagger-ui 文档更漂亮且更易于理解。
【问题讨论】:
标签: clojure compojure plumatic-schema compojure-api