在环服务器内处理http请求时,请求数据的主体存储在密钥:body
的请求哈希映射中。例如如下:
#object[org.eclipse.jetty.server.HttpInputOverHTTP 0x2d88a9aa "HttpInputOverHTTP@2d88a9aa"]
如果我对原始文本感兴趣,我怎么读出这个对象?
答案 0 :(得分:4)
您可以使用ring.util.request/body-string
将请求正文作为字符串。
(body-string request)
您需要记住InputStream
只能读取一次,因此您可能更愿意将原始:body
替换为读取String
,以便稍后再次访问它:
(defn wrap-body-string [handler]
(fn [request]
(let [body-str (ring.util.request/body-string request)]
(handler (assoc request :body (java.io.StringReader. body-str)))))
添加中间件来包装处理程序:
(def app
(wrap-body-str handler))
答案 1 :(得分:0)
响铃请求的:body
必须是java.io.InputStream
的实例。
因此,您可以使用reader + slurp来获取字符串。
(defn is->str [is]
(let [rdr (clojure.java.io/reader is)]
(slurp rdr)))
用法:(is->str (:body request))
答案 2 :(得分:0)
按照 user1338062
的建议,您可以简单地在请求正文中调用 slurp
。
(defn handler [request] (let [body (slurp (:body request))]))