2014-01-24 1 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을 추가 할 수 다중 요청은 아래? 당신이 헤더로 컨텐츠 ID를 치료하는 경우

답변

0

, 도움이 될 것입니다 귀하의 요청에지도로 변경 :Content-Id "Id 1" 추가 : 본문으로 컨텐츠 ID를 치료하는 경우

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

, 그냥 몸

로에 넣어
+0

이미이 옵션을 시도했지만 작동하지 않습니다 .https : //github.com/dakrone/clj-http/blob/master/src/clj_http/multipart.clj ----- multipart.clj의 link api Content-ID를 사용하여 멀티 파트 요청을 만들지는 않습니다. 콘텐츠 ID를 멀티 파트 요청에 추가하는 다른 방법이 있습니까? – Jitendra

1

: name 속성은 엔터티의 이름 즉 멀티 파트의 첫 번째 내용 등을 나타내는 데 사용됩니다.

Clojure에는 다중 요청에서 콘텐츠 ID를 추가하는 기능이 없습니다. 그러나 clojure에서 clj-http 클라이언트는 내부적으로 http-client api를 사용하여 다중 요청을 작성합니다. clj-http에 멀티 파트를 만드는 방법에 대한 링크는 this 을 참조하십시오.

clj-http 클라이언트는 어디서나 콘텐츠 ID를 사용하지 않습니다. 따라서 한 가지 분명한 사실은 멀티 파트 요청을 content-id로 만들 수 없음을 의미합니다.

내가 찾은 한 가지 해결책은 clojure에서 http-client 패키지를 가져 와서 여러 부분 요청을 작성하는 것입니다. http-client를 의존성으로 사용하여 clj-http에게 말했듯이, 어떤 http-client jar도 다운로드 할 필요가 없습니다.

(: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 요청을위한 body로 제공하십시오. 하지만 순수 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가 사용됩니다.

희망이 있으면 도움이 될 것입니다.