假设我有这个处理程序:
(defroutes routes
(DELETE "/books" [id] (delete-book id)))
如果请求不包含ID,我该怎么做才能使此应用返回HTTP 404?
答案 0 :(得分:5)
首先,您可以将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)
作为始终匹配的最终路线。
最后,如果您希望对大量的Compojure处理程序应用过滤,您可能希望将它们组合成一个具有Compojure的defroutes
或routes
(后者是函数)的处理程序,并且将它们包装在一块中间件中:
(defn wrap-404 [handler]
(fn wrap-404 [request]
(when (-> request :params :id)
(handler request))))
然后,您可以将包装的处理程序作为routes
/ defroutes
表单中的条目包含在内。