2015-07-11 137 views
1

我得到身体和头从这样的请求特定的HTTP标头:我怎样才能在的Compojure请求

(POST "/api/item" {body :body headers :headers} (create-item body headers)) 

身体被包裹,所以我得到一个关键字地图,我可以很容易采取从那个值:

(def app 
    (-> (handler/api app-routes) 
     (middleware/wrap-json-body {:keywords? true}) 
     (middleware/wrap-json-response))) 

简单:

(:item-name body) 

我怎样才能实现与标题相同,或只是简单地采取一个特定的标题值?我是否必须首先将标题映射到Clojure数据结构?

如果我打印头,我得到这样的:

({host localhost:3000, user-agent Mozilla/5.0}) 

回答

2

标头是已在Clojure的数据结构。如果您想更好地了解目前的数据类型,请使用prn而不是println,您将看到它是一个以字符串作为关键字的哈希映射。

(:foo x)(get x :foo)的快捷方式。对于带有字符串键的哈希映射,您可以使用例如。 (get headers "host")。在clojure.walk,clojure.walk/keywordize-keys中有一个函数,它将数据结构的关键字通过嵌套结构递归地转换为关键字。恕我直言,这是一个有点傻,在大多数情况下最好使用get和字符串键。

+1

我已经能够到达解决方案了,谢谢。事实证明,我需要'(获得(第一标题)“主机”)'因为标题出现在'ArraySeq'中。 – alundy