4

不久前,Chris Granger 发布了这个中间件,以使 JSON 哈希值出现在 defpage 参数中的伞形“主干”元素下。

(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 中显示为顶级参数;即摆脱 :backbone 伞?

4

3 回答 3

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)))
于 2012-05-17T15:51:50.217 回答
0

知道了。 assoc仅适用于一个元素,因此您必须将所有内容都放在:backbone保护伞下。要将所有JSON 元素推送到参数中,您必须使用merge. 因此将第 4 行更改为:

(update-in req [:params] merge (json/parse-string (slurp (:body req)) true))
于 2012-05-17T16:41:30.420 回答
-1

如果您不介意引入另一个依赖项,可以使用ring-middleware-format 库。

指示:

  • 添加[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 一样使用。

于 2012-07-22T08:12:28.233 回答