8

org.clojure/clojure-contrib "1.2.0" ring "1.1.8" compojure "1.1.5" 影响力 "1.1.0"

(defroutes rest-routes
    (GET "/" [] "<p> Hello </p>")
    (POST "/api/v1/:stor/sync" [stor] (start-sync stor))
    (POST ["/api/v1/:stor/:txn/data/:file" :file #".*"] [stor txn file] (txn-add stor txn file))
    (ANY "*" [] "<p>Page not found. </p>"))

在第二个 POST 中,我还想将所有 http-headers 传递给“txn-add”处理程序。我做了很多谷歌并查看代码,但找不到任何有用的东西。

我知道,我可以使用以下内容传递标头(但它不解析 url 请求),

(POST "/api/v1"
  {headers :headers} (txn-add "dummy stor" "dummy txn" headers))

另外,如何将 POST 请求的内容(即:body)传递给“txn-add”?

4

2 回答 2

11

如果 GET、POST 等的第二个参数不是向量,则它是request. 这意味着您可以执行以下操作:

(GET "/my/path"
   {:keys [headers params body] :as request} 
   (my-fn headers body request))

挑选出request你想要的部分。请参阅Ring SPECClojure 的关于绑定和解构的文档

于 2013-05-23T06:22:04.787 回答
6

The whole request map can be specified in the bindings using :as keyword in bindings and then used to read headers or body :

(POST ["/api/v1/:stor/:txn/data/:file" :file #".*"] 
      [stor txn file :as req] 
      (my-handler stor txn file req))
于 2013-05-23T06:27:09.743 回答