如何在Noir中获取JSON帖子数据

时间:2012-05-17 15:40:52

标签: clojure noir

前段时间,克​​里斯·格兰杰发布了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中显示为顶级参数;即摆脱:骨干伞?

3 个答案:

答案 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一样使用。