不久前,Chris Granger发布了
this middleware,以便在一个伞形“骨干”元素下出现在defpage params中的JSON哈希值.
(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中显示为顶级参数;即摆脱:骨干伞?
最佳答案 你可以做两件事.一种选择是用解析JSON后返回的映射替换:params的值.为此,只需将新地图与: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)))