【问题标题】:How to create a multipart request in clojure using clj-http api如何使用 clj-http api 在 clojure 中创建多部分请求
【发布时间】:2014-01-24 12:27:50
【问题描述】:

我想使用 clj-http 创建一个多部分 HTTP 请求。多部分请求如下:

--Boundary

Content-Type: text/xml; charset=UTF-8

Content-Id id1

xml1

--Boundary
Content-Type: text/xml; charset=UTF-8
Content-Id id2

xml2

--Boundary--

我正在使用这个 Clojure 代码来构建多部分请求:

(post "url"
      {:multipart [{:name "XML1"
                    :content Xml1
                    :encoding "UTF-8"
                    :mime-type "text/xml"}
                   {:name "XML2"
                    :content Xml2
                    :encoding "UTF-8"
                    :mime-type "text/xml"}]})

如何在多部分中添加Content-Id

【问题讨论】:

    标签: clojure clojure-contrib clojure-java-interop


    【解决方案1】:

    :name 属性用于给出实体的名称,即多部分的第一个内容等等。

    Clojure 缺少在多部分请求中添加内容 ID 的功能。 但是,在 clojure 中,clj-http 客户端内部使用 http-client api 来构建多部分请求。见this 关于如何在 clj-http 中创建 multipart 的链接。

    clj-http 客户端没有在任何地方使用内容 ID。所以,有一件事很清楚,我们不能创造 带有 content-id 的多部分请求。

    我找到了一个解决方案,只需在 clojure 中导入 http-client 包并创建多部分请求。无需下载任何 http-client jar,因为我告诉 clj-http 使用 http-client 作为依赖项。

    (:import  (java.nio.charset Charset)
                (org.apache.http.entity.mime MultipartEntity)
                (org.apache.http.entity.mime FormBodyPart)
                (org.apache.http.entity.mime HttpMultipartMode)
                (org.apache.http.entity.mime.content
                 ByteArrayBody
                 FileBody
                 InputStreamBody
                 StringBody))
    

    只需使用下面的函数模板来创建您自己的请求。 并将多部分对象作为 :body 用于 http 请求。 但是,它不是纯粹的 clojure 实现。这是临时解决方案。

    (defn build-form-body [formbody content cid]
      (let [sb (StringBody. content "text/xml" (Charset/forName "utf-8"))]
        (let [fb (FormBodyPart. formbody , sb)]
        (.addField fb "Content-Id" cid)
        fb)))
    
    (defn build-multipart []
      (let [mp-entity (MultipartEntity.)]
        (.addPart mp-entity (make-form-body "formbody1" Xml1 "content-id1-val"))
        (.addPart mp-entity (make-form-body "formbody2" Xml2 "content-id1-val2"))
        mp-entity))
    

    注意:给出正确的内容类型。就我而言,它是 xml,所以对我来说是“text/xml”和字符串体。 如果是文件,那么内容类型将改变并使用 FileBody 等等。

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      如果您将 Content-Id 视为标头,请将 :Content-Id "Id 1" 添加到您的请求映射中应该会有所帮助,更改为:

      {:name "XML1"
      :content Xml1
      :Content-Id "Id 1"
      :encoding "UTF-8"
      :mime-type "text/xml"}
      

      如果你把Content-Id当成body,直接放到body里面就行了

      【讨论】:

      猜你喜欢
      • 2022-06-12
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多