2014-01-24 27 views
1

我想使用clj-http创建多部分HTTP请求。多要求低于:如何使用clj-http api在clojure中创建多部分请求

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

回答

0

如果你把内容ID作为标题,添加:Content-Id "Id 1"您的要求的地图应该帮助,更改为:

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

如果你把内容ID作为体,把它放在身体

+0

我们已经尝试过这个选项,但它不工作.https://github.com/dakrone/clj-http/blob/master/src/clj_http/multipart.clj ----- multipart.clj的链接api ,没有使用content-id来创建多部分请求。是否有任何其他方式将content-id添加到多部分请求 – Jitendra

1

:name属性用于给出实体的名称,即multipart的第1个内容等等。

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

clj-http client没有在任何地方使用内容id。因此,有一点很清楚,我们无法使用content-id创建 多部分请求。

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

(: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实现。这是临时解决方案。

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

希望它能帮助你。