如何在Clojure Compojure/Ring项目中获取`HttpInputOverHTTP`的内容?

4
如何在 Compojure/Ring 项目中获取一个传入的 POST http 请求的 :body #object[org.eclipse.jetty.server.HttpInputOverHTTP 0x42c3599b "HttpInputOverHTTP@42c3599b"] 内容?
我知道这个 :body 由一个名为 data 的部分和一个名为 excel 的部分组成,其中 data 的 MIME-type 是 text-plain,excel 的 MIME-type 是 application/excel。
我使用 slurp 读取了 :body 的内容,结果显示为: enter image description here
3个回答

5
手动解析二进制流将非常困难。将您的处理程序包装如下: (wrap-multipart-params handler options)
这个中间件会解析主体并将解析后的数据填充到<:params>参数中。
有关更多详细信息,请参见{{link1:ring.middleware.multipart-params}}文档。

0
我在Reitit里面看到这个问题,解决方法是改变中间件的顺序,让exception-middleware放在multipart/multipart-middleware之后。
:middleware [;; multipart
             multipart/multipart-middleware
             ;; exception handling
             exception-middleware]

-1

你可以在《Clojure Cookbook (O'Reilly)》中找到一个基本示例,我强烈推荐:

(ns ringtest
  (:require
    [ring.adapter.jetty :as jetty]
    clojure.pprint))

;; Echo (with pretty-print) the request received
(defn handler [request]
  {:status 200
   :headers {"content-type" "text/clojure"}
   :body (with-out-str (clojure.pprint/pprint request))})

(defn -main []
  ;; Run the server on port 3000
  (jetty/run-jetty handler {:port 3000}))

这与问题无关,不能解决问题。请查看已接受的答案。 - Juraj Martinka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接