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