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

Posted

技术标签:

【中文标题】如何访问:compojure 函数中的标题【英文标题】:how to you access :headers inside compojure function 【发布时间】:2013-05-18 08:35:50 【问题描述】:

org.clojure/clojure-contrib "1.2.0" 环“1.1.8” 合成“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”?

【问题讨论】:

如果您找到了解决方案,请务必将答案标记为正确。 【参考方案1】:

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

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

挑选你想要的request的部分。见the Ring SPEC和Clojure's docs on binding & destructuring

【讨论】:

我对整个 clojure 有点陌生(刚开始两周)。因此,不确定我是否理解您的回答。但是,我需要解析 [stor txn 文件] 的“url”部分,然后还需要在 (POST ["/api/v1/:stor/:txn/data/:file" :file #".*"] [stor txn file] (txn-add stor txn file)) 中传递 :headers。所以,我需要结合向量参数和解构绑定形式,如何实现【参考方案2】:

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

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

【讨论】:

谢谢。它起到了神奇的作用(但它对我来说仍然是一个黑魔法,因为我无法通过盯着 github 上的 compojure 代码来解决这个问题)。现在,我可以将所有参数(url 组件和标题)传递给处理程序。 查看github.com/weavejester/compojure/blob/master/src/compojure/… 了解如何处理绑定 感谢 Ankur。看看“向量绑定”的实现,我现在很清楚它是如何工作的。

以上是关于如何访问:compojure 函数中的标题的主要内容,如果未能解决你的问题,请参考以下文章

如何绑定动态变量?

Compojure 中的 CSS 入门?

compojure-api 中的 body 和 body-params 有啥区别?

compojure-api/schema/swagger 中的非必需参数?

您如何使用 Compojure/Ring 会话?

Compojure 绑定来自 URL 的 HTTP 请求参数,而不是来自 POST 表单