假设我有这个处理程序:
(defroutes routes
(DELETE "/books" [id] (delete-book id)))
当请求不包含 ID 时,我该怎么做才能使此应用返回 HTTP 404?
首先,您可以制作id
URI 的一部分,这看起来不错且 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
表单中。