4

假设我有这个处理程序:

(defroutes routes
  (DELETE    "/books"      [id]              (delete-book id)))

当请求不包含 ID 时,我该怎么做才能使此应用返回 HTTP 404?

4

1 回答 1

7

首先,您可以制作idURI 的一部分,这看起来不错且 RESTful,并允许您使用路由语法来强加您的条件:

(GET ["/books/:id" :id #"[0-9]+"] [] ...)

如果您确实更喜欢使用参数,例如

(if-not id
  (ring.util.response/not-found body-for-404)
  ...)

应该可以在下一个 Ring 版本中使用,尽管这个特定的功能还没有发布({:status 404 :headers {} :body the-body}虽然它只是返回)。

还,

(when id
  ...)

将导致等效的路由匹配失败,并且将尝试其余路由;那么你可以使用

(compojure.route/not-found body-for-404)

作为始终匹配的最终路线。

defroutes最后,如果您希望对一大组 Compojure 处理程序应用过滤,您可能希望将它们与 Compojure 的or (后者是一个函数)组合成一个处理程序,并将它们routes包装在一个中间件中:

(defn wrap-404 [handler]
  (fn wrap-404 [request]
    (when (-> request :params :id)
      (handler request))))

然后,您可以将包装的处理程序作为条目包含在routes/defroutes表单中。

于 2012-02-24T09:04:25.457 回答