ring:将 http 请求的正文读取为字符串

Ant*_*ald 6 clojure ring

在环服务器内部处理 http 请求时,请求数据的主体存储在 key 中的 request-hashmap 中:body。例如如下:

#object[org.eclipse.jetty.server.HttpInputOverHTTP 0x2d88a9aa "HttpInputOverHTTP@2d88a9aa"] 
Run Code Online (Sandbox Code Playgroud)

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

Pio*_*dyl 8

您可以使用ring.util.request/body-string以字符串形式获取请求正文。

(body-string request) 
Run Code Online (Sandbox Code Playgroud)

您需要记住,它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))))))
Run Code Online (Sandbox Code Playgroud)

并添加您的中间件来包装您的处理程序:

(def app
  (wrap-body-string handler))
Run Code Online (Sandbox Code Playgroud)