如何访问:compojure函数内的标题

时间:2013-05-23 05:27:56

标签: clojure http-headers compojure

org.clojure / clojure-contrib“1.2.0” 戒指“1.1.8” compojure“1.1.5” clout“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-header传递给“txn-add”处理程序。我做了很多谷歌并查看代码,但找不到任何有用的东西。

我知道,我可以使用以下方法传递标题(但是它不会解析网址请求),

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

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

2 个答案:

答案 0 :(得分:8)

如果GET,POST等的第二个参数不是向量,它是request的解构绑定表单。这意味着您可以执行以下操作:

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

挑选出你想要的request部分。请参阅the Ring SPECClojure's docs on binding & destructuring

答案 1 :(得分:6)

可以在绑定中使用:as关键字在绑定中指定整个请求映射,然后用于读取标题或正文:

(POST ["/api/v1/:stor/:txn/data/:file" :file #".*"] 
      [stor txn file :as req] 
      (my-handler stor txn file req))