2017-11-14 3 views
1

Ich benutze Compojure-API, und ich bin auf der Suche nach einer Funktion, die, angesichts meiner api Route Struktur Thingie und eine Anfrage, die Route Datensatz (oder: Name) für diese Anfrage, ohne seinen Handler anzuwenden.Erhalte Route Datensatz (oder: Name) für eine bestimmte Anfrage

Ich war in der Lage, eine Art der Umkehrung von dem zu finden, was ich in compojure.api.routes/path-for suche, das, gegeben a: Name, den Pfad für die entsprechende Route zurückgibt. Im selben Namespace gibt es auch Funktionen wie get-routes, die vielversprechend erscheinen, aber ich muss noch genau das finden, wonach ich suche.

Mit anderen Worten, dieses einfache Beispiel gegeben

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

Ich bin für eine Funktion foo suchen,

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

Irgendwelche Ideen, wie das funktioniert?

Antwort

3

my-api als Route Record definiert, so können Sie es auf der repl bewerten, um zu sehen, wie es aussieht:

#Route{:info {:coercion :schema}, 
     :childs [#Route{:childs [#Route{:path "/", 
             :info {:static-context? true}, 
             :childs [#Route{:path "/myroute", 
                 :method :get, 
                 :info {:name :my-get, :public {:x-name :my-get}}} 
               #Route{:path "/myroute", 
                 :method :post, 
                 :info {:name :my-post, :public {:x-name :my-post}}}]}]}]} 

Es gibt Helfer in compojure.api.routes, um die Struktur transformieren:

(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}}]] 

, wodurch der Routenbaum unter Beibehaltung der Reihenfolge effektiv abgeflacht wird. Bei Reverse-Routing gibt es:

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

Mehr Dienstprogramme hinzugefügt, wenn nötig werden können.

Hoffe, das hilft.

+0

Danke Tommi! Das bringt fast alles mit, es ist nur der letzte Pfad, den ich selbst nicht gerne machen würde (es wird leicht kompliziert, wenn Pfadparameter usw. enthalten sind). Aber ich denke, dass es funktionieren sollte, um Clout dafür zu verwenden, da das Compojure unter der Haube verwendet. – Marxama

+0

Ich denke, das wäre ein nützliches Werkzeug, würdest du gerne einen PR machen? Wenn das erledigt wäre? –

+0

Absolut, wird es tun! – Marxama

Verwandte Themen