【发布时间】:2017-02-08 11:24:30
【问题描述】:
我有一个基于 re-frame 的 UI,并尝试使用 re-frame-http-fx 与我的服务器通信。发送和响应似乎有效。但是,我不知道如何将 JSON 正文解析为服务器上的 Clojure 映射。
这是我的handler.clj,我可以得到它:
(ns my.handler
(:require [compojure.core :refer [GET POST defroutes]]
[compojure.route :refer [resources]]
[ring.util.response :refer [resource-response]]
[ring.middleware.json :refer [wrap-json-response wrap-json-body]]))
(defn json-post [request]
(let [body (:body request)]
(prn body)
body))
(defroutes routes
(GET "/" [] (resource-response "index.html" {:root "public"}))
(POST "/post" request json-post)
(resources "/"))
(def handler (wrap-json-response (wrap-json-body routes {:keywords? true})))
据我了解,wrap-json-body 中间件应将请求正文替换为解析后的版本(地图?)。
但是,我在 json-post 处理程序中从 (prn body) 得到的输出是这样的:
#object[org.httpkit.BytesInputStream 0xda8b162 "BytesInputStream[len=41]"]
如果我尝试(prn (:title body)) 之类的东西,我会得到nil(尽管原始的map-turned-json-request 包含:title,以及请求和响应正文)。
请求和响应包含正确的 json。请求Content-Type 正确设置为application/json(由re-frame-http-fx 发送)。缓冲区的长度 (41) 也是根据请求的正确正文长度。
我要尝试的东西已经不多了。有什么想法吗?
【问题讨论】:
-
你能尝试 slurping 输入流看看里面有什么吗?您可以尝试不包装 JSON 响应吗?
-
啜饮输入流给了我包含预期 json 的原始请求正文。我没有尝试删除环中间件,因为我偶然发现了解决方案(见答案)。感谢和抱歉给您带来的麻烦。