如何在compojure请求中获取特定的http标头

时间:2015-07-11 13:30:40

标签: clojure compojure ring

我从请求中获取正文和标题,如下所示:

(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})

1 个答案:

答案 0 :(得分:2)

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

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