次のハンドラーがあるとします。
(defroutes routes
(DELETE "/books" [id] (delete-book id)))
リクエストに ID が含まれていない場合に、このアプリが HTTP 404 を返すようにするにはどうすればよいですか?
まず、URI の a 部分を作成できますid
。これは、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
or routes
(後者は関数です) を使用して 1 つのハンドラーに結合し、それらをミドルウェアでラップすることができます。
(defn wrap-404 [handler]
(fn wrap-404 [request]
(when (-> request :params :id)
(handler request))))
routes
その後、ラップされたハンドラーを/defroutes
フォームのエントリとして含めることができます。