2012-02-24 1 views
2

は、私は、このハンドラがあるとします。Compojure - 必要なパラメータがなくなると404を返す方法?

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

は、私は、要求がIDが含まれていない場合には、このアプリのリターンHTTP 404を作るために何ができますか?あなたが使用することを好むない場合

(GET ["/books/:id" :id #"[0-9]+"] [] ...) 

答えて

4

まず、あなたはidいいとRESTfulなようだと、あなたの条件を課すためにルート構文を使用できるようになるURIの一部を、作ることができますこの特定の関数は(それは単にしかし{:status 404 :headers {} :body the-body}を返す)まだリリースされていないものの、パラメータ、

(if-not id 
    (ring.util.response/not-found body-for-404) 
    ...) 

のようなものは、次のリングバージョンで動作するはずです。

また、

(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フォームのエントリとしてラップハンドラを含めることができます。

+0

自動的に行う方法はありませんか(たとえば、コンポジットマクロのパラメータを使用して)?すべてのルートでそれをするのは嫌いです。 –

+0

私は物事を乾燥させるいくつかの方法で答えを編集しました。私は自分自身でURIベースのアプローチに行きます。 CompojureのDSLでparamsマップの実際の内容に条件を課す魔法の構文はありません。 –

関連する問題