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