如何在Compojure函数内访问: headers

8

org.clojure/clojure-contrib "1.2.0" ring "1.1.8" compojure "1.1.5" clout "1.1.0"

上述内容是有关IT技术的,在这里列出了一些软件库和版本号,其中包括Clojure贡献、Ring、Compojure和Clout。这些库可以帮助开发人员在使用Clojure编程语言时实现不同的功能。
(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头部传递到“txn-add”处理程序。我进行了大量的谷歌搜索并查看了代码,但没有找到有用的信息。
我知道可以使用以下方法来传递头部(但它不会解析URL请求)。
(POST "/api/v1"
  {headers :headers} (txn-add "dummy stor" "dummy txn" headers))

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

如果您已经找到了解决方案,请确保将答案标记为正确。 - Ankur
2个回答

11

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

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

选择您想要的request部分。请参阅Ring SPECClojure绑定和解构文档


我对Clojure还比较新(只学了两周)。因此,不确定我是否理解了你的回答。但是,我需要解析“url”部分以获取[stor txn file],然后在(POST ["/api/v1/:stor/:txn/data/:file" :file #".*"] [stor txn file] (txn-add stor txn file))中也需要传递:headers。因此,我需要向量参数和解构绑定形式的组合,如何实现? - Shanti Adhikari

6

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

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

谢谢。它起了魔法作用(但对我来说仍然是黑魔法,因为我无法通过在GitHub上盯着compojure代码来弄清楚这个问题)。现在,我能够将所有参数(URL组件和标头)传递给处理程序。 - Shanti Adhikari
请查看 https://github.com/weavejester/compojure/blob/master/src/compojure/core.clj#L66 了解如何处理绑定。 - Ankur
谢谢Ankur。看了一下“vector-bindings”的实现,我现在明白它是如何工作的了。 - Shanti Adhikari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接