compojure-api返回值模式或错误

时间:2016-02-25 04:40:11

标签: clojure compojure plumatic-schema 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"
  }
}

docs表明您可以提供多个响应模式,但我不清楚我的get-pizza fn应该返回什么才能使用这些模式。他们的示例使用ring-http-response lib生成返回值,但get-pizzaring-http-response 'not found' fn的返回值没有区别。

说实话,如果可能,我宁愿不使用:responses参数,因为我已经可以预见所有代码重复。在指定:return架构之前,我能够让get-pizza fn返回404并正确地传递给请求者但是一旦我添加了架构,我就无法再这样做了。我认为返回值为:return (s/one Pizza Error),其中Error将是一般定义的错误地图,但我不知道为什么我会为每条路由执行此操作理论上回调可以返回500。

注意:我转而使用:return param的原因是它使得生成的swagger-ui文档更加漂亮和优秀。更容易理解。

1 个答案:

答案 0 :(得分:-1)

我假设您的代码中存在一个小问题,因为您没有显示get-pizza [id]函数的实现。

您返回{:status 404 :body {:message "Invalid ID provided}},然后(ok (get-pizza id))将其包装到HTTP 200响应中。

如果找不到,您的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"})))

The original example from compojure-api repo的实现略有不同,对于来自nil的{​​{1}}值,它仍将返回具有空响应正文的HTTP 200响应。根据您的问题,您将返回404而上述代码应符合您的要求。