4

我想使用clj-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多部分?

4

2 回答 2

1

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

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

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 等等。

希望它会帮助你。

于 2014-02-06T19:23:46.260 回答
0

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

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

如果您将 Content-Id 视为正文,只需将其放入正文

于 2014-01-25T08:11:24.880 回答