前段时间,克里斯·格兰杰发布了this middleware来获取JSON哈希值,这些哈希值出现在一个伞形“骨干”元素下的defpage params中。
(defn backbone [handler]
(fn [req]
(let [neue (if (= "application/json" (get-in req [:headers "content-type"]))
(update-in req [:params] assoc :backbone (json/parse-string (slurp (:body req)) true))
req)]
(handler neue))))
如何修改此代码以使JSON元素在defpage中显示为顶级参数;即摆脱:骨干伞?
答案 0 :(得分:3)
你可以做两件事。一种选择是将:params
的值替换为解析JSON后返回的映射。为此,只需将新地图与:params
键相关联。
(assoc req [:params] (json/parse-string (slurp (:body req)) true))
另一个选项(由@dAni建议)是将已解析的JSON的值合并到一起,以便不覆盖:params
映射中的现有值。您需要使用partial
而不是仅使用merge
的原因是因为最终地图是从左到右的地图的合并结果。如果您希望JSON映射中的值优先使用,那么您的解决方案将起作用。
(update-in req [:params]
(partial merge (json/parse-string (slurp (:body req)) true)))
答案 1 :(得分:0)
知道了。 assoc
仅适用于一个元素,因此您必须将所有内容放在:backbone
保护伞下。要将所有 JSON元素推送到参数中,您必须使用merge
。所以将第4行改为:
(update-in req [:params] merge (json/parse-string (slurp (:body req)) true))
答案 2 :(得分:-1)
如果你不介意引入另一个依赖项,可以使用ring-middleware-format library.
说明:
将[ring-middleware-format "0.1.1"]
添加到您的project.clj
然后在server.clj
中添加以下代码:
代码:
(:require [ring.middleware.format-params :as format-params])
(server/add-middleware format-params/wrap-json-params)
(defn -main [& m]
; Start the server...
)
现在任何传入的JSON都可以像POSTdata一样使用。