gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:25:32 28 4
gpt4 key购买 nike

我想使用 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

最佳答案

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

Clojure 缺乏在多部分请求中添加内容 ID 的功能。但是,在 clojure 中,clj-http 客户端在内部使用 http-client api 来构建多部分请求。请参阅this 有关如何在 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))

只需使用下面的函数模板来创建您自己的请求。并将多部分对象作为 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 等。

希望对您有帮助。

关于clojure - 如何使用 clj-http api 在 clojure 中创建多部分请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21332736/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com