4

次のハンドラーがあるとします。

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

リクエストに ID が含まれていない場合に、このアプリが HTTP 404 を返すようにするにはどうすればよいですか?

4

1 に答える 1

7

まず、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 のdefroutesor routes(後者は関数です) を使用して 1 つのハンドラーに結合し、それらをミドルウェアでラップすることができます。

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

routesその後、ラップされたハンドラーを/defroutesフォームのエントリとして含めることができます。

于 2012-02-24T09:04:25.457 に答える