【问题标题】:How can I get a specific http header in a compojure request如何在组合请求中获取特定的 http 标头
【发布时间】:2015-09-30 04:48:50
【问题描述】:

我从这样的请求中获取正文和标头:

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

【问题讨论】:

    标签: clojure compojure ring


    【解决方案1】:

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

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

    【讨论】:

    • 我现在已经能够找到解决方案,谢谢。原来我需要(get (first headers) "host"),因为标题来自ArraySeq
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    相关资源
    最近更新 更多