首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用clj-http api在clojure中创建多部分请求

如何使用clj-http api在clojure中创建多部分请求
EN

Stack Overflow用户
提问于 2014-01-24 20:27:51
回答 2查看 1.5K关注 0票数 4

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

代码语言:javascript
复制
--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代码来构建多部分请求:

代码语言:javascript
复制
(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

EN

回答 2

Stack Overflow用户

发布于 2014-02-07 03:23:46

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

Clojure缺少此功能,无法在多部分请求中添加内容id。然而,在clojure中,clj-http客户端内部使用http-client api来构建多部分请求。如何在clj-http中创建分块,请参见this链接。

clj-http客户端在任何地方都没有使用内容id。所以,有一件事是明确的,我们不能创建带有content-id的多部分请求。

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

代码语言:javascript
复制
(: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))

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

代码语言:javascript
复制
(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等。

希望能对你有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2014-01-25 16:11:25

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

代码语言:javascript
复制
{:name "XML1"
:content Xml1
:Content-Id "Id 1"
:encoding "UTF-8"
:mime-type "text/xml"}

如果您将Content-Id视为主体,则只需将其放入主体即可

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21332736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档