我从请求中获取正文和标题,如下所示:
(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})
答案 0 :(得分:2)
标头已经在Clojure数据结构中。如果您想更好地了解存在的数据类型,请使用prn
而不是println
,您会看到它是一个以字符串为键的哈希映射。
(:foo x)
是(get x :foo)
的快捷方式。对于带有字符串键的哈希映射,您可以使用例如获取值。 (get headers "host")
。 clojure.walk
,clojure.walk/keywordize-keys
中有一个函数可以将数据结构的键转换为关键字,递归地通过嵌套结构。恕我直言,这有点傻,在大多数情况下,最好使用get
和字符串键。