我正在使用compojure-api,我正在寻找一个函数,根据我的api路由结构thingie和请求,返回该请求的Route记录(或:name),而不是应用它的处理程序。
我已经能够找到我在compojure.api.routes / path-for中查找的内容的反转,给定a:name,返回相应路径的路径。在相同的命名空间中,还有像get-routes这样的函数看起来很有希望,但我还没找到我正在寻找的东西。
换句话说,给出这个简单的例子
(defapi my-api
(context "/" []
(GET "/myroute" request
:name :my-get
(ok))
(POST "/myroute" request
:name :my-post
(ok))))
我正在寻找一个像这样工作的函数foo
(foo my-api (mock/request :get "/myroute"))
;; => #Route{:path "/myroute", :method :get, :info {:name :my-get, :public {:x-name :my-get}}}
;; or
;; => :my-get
有什么想法吗?
答案 0 :(得分:3)
my-api
被定义为Route Record
,因此您可以在repl上对其进行评估,看看它是什么样的:
#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}}}]}]}]}
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}}}
如果需要,可以添加更多实用程序。
希望这有帮助。