ring:将http请求的主体读为字符串

时间:2016-05-23 17:57:55

标签: clojure ring

在环服务器内处理http请求时,请求数据的主体存储在密钥:body的请求哈希映射中。例如如下:

#object[org.eclipse.jetty.server.HttpInputOverHTTP 0x2d88a9aa "HttpInputOverHTTP@2d88a9aa"] 

如果我对原始文本感兴趣,我怎么读出这个对象?

3 个答案:

答案 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))]))