2017-11-14 6 views
1

私はcompojure-apiを使用しています。私のapiルート構造体とリクエストを受け取ったルートレコードを返す関数を探しています(または:そのハンドラを適用せずに、特定のリクエストのルートレコード(または:名前)を取得する

compojure.api.routes/path-forで私が探しているものの逆の種類を見つけることができました。これは:nameを指定すると対応するルートのパスを返します。同じネームスペースには有望に見えるget-routesのような機能もありますが、私が探しているものをまだ見つけていません。言い換えれば

は、この単純な例

(defapi my-api 
    (context "/" [] 
    (GET "/myroute" request 
     :name :my-get 
     (ok)) 
    (POST "/myroute" request 
     :name :my-post 
     (ok)))) 

与えられた私は、この

(foo my-api (mock/request :get "/myroute")) 
;; => #Route{:path "/myroute", :method :get, :info {:name :my-get, :public {:x-name :my-get}}} 
;; or 
;; => :my-get 

のように任意のアイデアを作品関数fooを探していますか?あなたはそれがどのように見えるかを確認するためにREPLでそれを評価することができるように

答えて

3

my-apiは、Route Record次のように定義されます

​​

構造を変換するためcompojure.api.routesでヘルパーがあります

(require '[compojure.api.routes :as routes]) 

(routes/get-routes my-api) 
; [["/myroute" :get {:coercion :schema, :static-context? true, :name :my-get, :public {:x-name :my-get}}] 
; ["/myroute" :post {:coercion :schema, :static-context? true, :name :my-post, :public {:x-name :my-post}}]] 

これは、順序を保持しながらルートツリーを効果的に平坦化します。リバースルーティングの場合は、

(-> my-api 
    routes/get-routes 
    routes/route-lookup-table) 
; {:my-get {"/myroute" {:method :get}} 
; :my-post {"/myroute" {:method :post}}} 

必要に応じて追加のユーティリティを追加できます。

これが役に立ちます。

+0

ありがとうTommi!それはほとんどすべての方法を取得します、それは私が自分自身をすることを嫌っている(パスパラメータなどが含まれていると簡単に複雑になる)それにマッチする最終パスです。しかし、それはCompojureがボンネットの下で使用するものなので、Cloutを使うのが効果的だと思います。 – Marxama

+0

私はそれが有用なツールになると思う、あなたはPRをしたいと思いますか? –

+0

絶対に、やります! – Marxama

関連する問題