我想使用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
?
答案 0 :(得分:1)
:name属性用于给出实体名称,即multipart的第一个内容,依此类推。
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))
只需使用以下功能模板即可创建自己的请求。 并将multipart对象作为: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等。
希望它会对你有所帮助。
答案 1 :(得分:0)
如果您将Content-Id视为标题,请将:Content-Id "Id 1"
添加到您的请求地图中,如果有帮助,请更改为:
{:name "XML1"
:content Xml1
:Content-Id "Id 1"
:encoding "UTF-8"
:mime-type "text/xml"}
如果您将Content-Id视为正文,只需将其放入正文
即可