0

compojure-api允许您定义return架构:

(s/defschema Pizza
  {:name s/Str})

(GET "/pizza/:id" [id]
  :return Pizza
  :summary "returns a Pizza"
  (ok (get-pizza id)))

我的问题是当get-pizzafn 返回 404时{:status 404 :body {:message "Invalid id provided"}},响应(对请求者)是 404 与Pizza架构不匹配:

{
  "errors": {
    "name": "missing-required-key",
    "status": "disallowed-key",
    "body": "disallowed-key"
  }
}

文档显示您可以提供多个响应模式,但我不清楚我的get-pizzafn 应该返回什么以利用这些模式。get-pizza他们的示例使用 ring-http-response 库生成返回值,但我的返回值 for和ring-http-response 'not found' fn之间没有区别。

老实说,如果可能的话,我宁愿不使用:responses参数,因为我已经可以预见到所有的代码重复。在指定:return架构之前,我能够让我的get-pizzafn 返回 404 并正确传递给请求者,但是一旦我添加了架构,我就无法再这样做了。我考虑让返回值是:return (s/one Pizza Error)一个Error通用定义的错误映射,但我不明白为什么如果理论上所有调用都可以返回 500,我为什么要为每条路由执行此操作。

注意:我转而使用:return参数的原因是它使生成的 swagger-ui 文档更漂亮且更易于理解。

4

1 回答 1

-1

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

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

如果未找到,您的get-pizza函数应返回比萨饼或 nil。您的 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 repo 的原始示例有一点不同的实现,其中的nilget-pizza仍然会返回带有空响应正文的 HTTP 200 响应。根据您的问题,您将返回 404 并且上面的代码应该满足您的要求。

于 2016-02-25T06:37:20.540 回答