0

liberator を compojure で使用しており、複数のメソッド (すべてのメソッドではありません) を保存リソースに送信したいと考えていました。繰り返しになりますが、一度に複数のハンドラーを定義できるものが欲しいです。

例:

(defroutes abc 
  (GET "/x" [] my-func)
  (HEAD "/x" [] my-func)
  (OPTIONS "/x" [] my-func))

近いはずです:

(defroutes abc
  (GET-HEAD-OPTIONS "/x" [] my-func))
4

2 に答える 2

2

チュートリアルに示されているように、慣用的な方法は、ルートでキーを使用してから、リソースでANYを定義することです。および:allowed-methods [:get :head :options]を実装する必要があります。:handle-ok:handle-options

(defroute collection-example
    (ANY ["/collection/:id" #".*"] [id] (entry-resource id))
    (ANY "/collection" [] list-resource))


(defresource list-resource
  :available-media-types ["application/json"]
  :allowed-methods [:get :post]
  :known-content-type? #(check-content-type % ["application/json"])
  :malformed? #(parse-json % ::data)
  :handle-ok #(map (fn [id] (str (build-entry-url (get % :request) id)))
                   (keys @entries)))
于 2014-01-20T15:57:11.387 に答える
1

何度か失敗した後、compojure.core/context マクロをこの目的に使用できることに気付きました。次のマクロを定義しました。

(defmacro read-only "Generate a route that matches HEAD, GET, or OPTIONS"
  [path args & body]
  `(context "" []
        (GET ~path ~args ~@body)
        (HEAD ~path ~args ~@body)
        (OPTIONS ~path ~args ~@body)))

これにより、次のことが可能になります。

(read-only "/x" [] my-func)

そして、私が必要とすることをしているようです。

于 2014-01-17T20:29:50.557 に答える