2
假设我有这样的处理程序:Compojure - 如何在不提供所需参数时返回404?
(defroutes routes
(DELETE "/books" [id] (delete-book id)))
我能做些什么,使这个应用程序返回HTTP 404时请求不包含ID?
假设我有这样的处理程序:Compojure - 如何在不提供所需参数时返回404?
(defroutes routes
(DELETE "/books" [id] (delete-book id)))
我能做些什么,使这个应用程序返回HTTP 404时请求不包含ID?
首先,你可以使id
的URI的一部分,这似乎不错,安谧,将允许您使用路由语法强加的条件:
(GET ["/books/:id" :id #"[0-9]+"] [] ...)
如果你更喜欢使用参数,像
(if-not id
(ring.util.response/not-found body-for-404)
...)
应该在未来的版本环工作,虽然这个特别的功能尚未发布(这只是返回{:status 404 :headers {} :body the-body}
虽然)。
此外,
(when id
...)
将导致路线匹配失败的等效和剩余路由将被尝试;那么你可以使用
(compojure.route/not-found body-for-404)
作为总是匹配的最终路线。
最后,如果你想申请过滤一大群的Compojure处理的,您不妨将它们合并成的Compojure的defroutes
或routes
单处理器(后者是一个函数),并在中间件的包装他们:
(defn wrap-404 [handler]
(fn wrap-404 [request]
(when (-> request :params :id)
(handler request))))
然后,您可以包括包裹处理程序,routes
/defroutes
形式的条目。
有没有办法自动做到这一点(例如,与组成宏的参数)?讨厌为所有路线做。 – 2012-02-24 09:06:25
我已经编辑了一些干的东西了。我自己会使用基于URI的方法。对Compojure的DSL中params地图的实际内容施加条件没有神奇的语法。 – 2012-02-24 09:49:22