ring:将 http 请求的正文读取为字符串
ring: read body of a http request as string
在环形服务器内处理 http 请求时,请求数据的主体存储在键 :body
中的请求哈希图中。例如如下:
#object[org.eclipse.jetty.server.HttpInputOverHTTP 0x2d88a9aa "HttpInputOverHTTP@2d88a9aa"]
如果我只对原始文本感兴趣,我该如何读出这个对象?
您可以使用 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-string handler))
响铃请求的:body
必须是java.io.InputStream
的实例。
所以你可以使用 reader + slurp 来得到一个字符串。
(defn is->str [is]
(let [rdr (clojure.java.io/reader is)]
(slurp rdr)))
用法:(is->str (:body request))
根据 user1338062
的建议,您只需在请求正文中调用 slurp
。
(defn handler [request] (let [body (slurp (:body request))]))
在环形服务器内处理 http 请求时,请求数据的主体存储在键 :body
中的请求哈希图中。例如如下:
#object[org.eclipse.jetty.server.HttpInputOverHTTP 0x2d88a9aa "HttpInputOverHTTP@2d88a9aa"]
如果我只对原始文本感兴趣,我该如何读出这个对象?
您可以使用 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-string handler))
响铃请求的:body
必须是java.io.InputStream
的实例。
所以你可以使用 reader + slurp 来得到一个字符串。
(defn is->str [is]
(let [rdr (clojure.java.io/reader is)]
(slurp rdr)))
用法:(is->str (:body request))
根据 user1338062
的建议,您只需在请求正文中调用 slurp
。
(defn handler [request] (let [body (slurp (:body request))]))