Compojure - 如果没有提供所需的参数,如何返回404?

时间:2012-02-24 08:56:53

标签: clojure compojure

假设我有这个处理程序:

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

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

1 个答案:

答案 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的defroutesroutes(后者是函数)的处理程序,并且将它们包装在一块中间件中:

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

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