获取给定请求的路径记录(或:名称)

时间:2017-11-14 11:07:08

标签: clojure compojure compojure-api

我正在使用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

有什么想法吗?

1 个答案:

答案 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}}}

如果需要,可以添加更多实用程序。

希望这有帮助。