如何使用 Java 在请求正文中使用 xml 创建多部分/混合请求?



下面是我想用JAVA创建的一个请求。 但是在第一部分中,我想放置XML,而不是字段或文本,而是XML,在第二部分中,我想上传的文件。此外,我的请求的每个部分都应该有不同的内容类型和内容处置。

那么如何为不同的部分设置不同的HTTP标头,就像在请求中一样呢?

另一个问题是:你能解释一下什么是内容处置以及何时使用它吗?

--boundary-string
Content-Disposition: name="request_payload"
Content-Type: text/xml
<tsRequest>
<datasource name="datasource-name" >
<connectionCredentials name="connection-username" password="connection-password"
embed="embed-flag" />
<project id="project-id" />
</datasource>
</tsRequest>
--boundary-string
Content-Disposition: name="tableau_datasource"; filename="datasource-file-name"
Content-Type: application/octet-stream
content-of-datasource-file
--boundary-string--

我想我看到了一些东西,但我不知道如何将我的内容配置放在零件中。这是我的代码:

HttpClient client = HttpClientBuilder.create().build();
File file = new File("D:/qwe.txt");
HttpPost post = new HttpPost("https://test.com/datasources");
post.setHeader("X-Tableau-Auth", "RfVJIasdsadrW");
StringBody stringBody1 = new StringBody("The XML body is here!", ContentType.APPLICATION_XML);
FileBody fileBody = new FileBody(file, ContentType.APPLICATION_OCTET_STREAM);

MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
builder.addPart("text1", stringBody1);
builder.addPart("upfile", fileBody);
HttpEntity entity = builder.build();
post.setEntity(entity);
HttpResponse response = client.execute(post);
System.out.println(response);

如何在这里放置内容处置:name="tableau_datasource";文件名="数据源文件名"?

我的意思是,使用您选择的语言提供的任何HTTP客户端API的多部分功能。你需要告诉你想要用什么语言发送它。但是任何有价值的HTTP客户端API都将提供这样做的可能性,而不必询问如何做到这一点。

编辑:所以语言是Java。使用 Apache 的 HttpClient 4.5 发送多部分请求相当容易。请参阅随附的示例。

编辑2:道歉。事实证明,通过查看示例毕竟没有那么明显。我发誓我记得它。

假设您有:

String document;
byte[] file;

您可以通过以下方式提出此请求:

HttpEntity entity = MultipartEntityBuilder.create()
.setMimeSubtype("mixed")
.addPart(FormBodyPartBuilder.create()
.setName("request_payload")
.setBody(new StringBody(document, ContentType.create("text/xml")))
.build())
.addPart(FormBodyPartBuilder.create()
.setName("tableau_datasource")
.setBody(new ByteArrayBody(file, "datasource-file-name"))
.build())
.build();
HttpPost request = new HttpPost("http://localhost:1337/test");
request.setEntity(entity);
client.execute(new HttpHost("localhost", PORT), request);

它产生:

POST /test HTTP/1.1
Content-Length: 410
Content-Type: multipart/mixed; boundary=xA-V-5psFZxuuisERy1jKEcqzo4vYI6Kq
Host: localhost:1337
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_144)
Accept-Encoding: gzip,deflate
--xA-V-5psFZxuuisERy1jKEcqzo4vYI6Kq
Content-Disposition: form-data; name="request_payload"
Content-Type: text/xml
Content-Transfer-Encoding: 8bit
<... the doc ...>
--xA-V-5psFZxuuisERy1jKEcqzo4vYI6Kq
Content-Disposition: form-data; name="tableau_datasource"; filename="datasource-file-name"
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
<... the file ...>
--xA-V-5psFZxuuisERy1jKEcqzo4vYI6Kq--

应该足够接近并以与您要求相同的方式接受。如有必要,可以进行微调。

另一个问题是:你能解释一下什么是内容处置以及何时使用它吗?

一般来说,它有助于提供有关多部分当前部分的信息,这些信息只有在多部分的上下文中才真正有意义。

示例:命名部件,以便您可以判断部件是否包含您的 XML 文档或是否包含您正在上传的文件(也可以是 XML 文件)。

另一个示例,指示部件的首选文件名(如果它通常要存储为文件)。

它最常见的用法是发送带有输入文件的常规 HTML 表单。这些作为多部分/表单数据发送,每个部分都有一个

Content-Disposition: form-data; name="name of the field defined in the HTML form"

和文件有

Content-Disposition: form-data; name="name of the input file field"; filename="filename.ext"

请注意,内容处置标头必须以指示部件性质的标记开头。在HTML表单中,即表单数据,几乎可以在其他任何地方使用附件。您还可以定义自己的消息,因为从技术上讲,发送像这样的多部分消息而不是HTML表单或SOAP请求,不是标准化的,因此客户端和服务器需要遵守为其创建的规范。

如果我们使用 MultipartEntityBuilder.create() 这将始终对数据进行编码 例如:创建如下所示的多部分将对 xml 和文件进行编码

String document = "<tsRequest>
<datasource name="datasource-name" >
<connectionCredentials name="connection-username" password="connection-password"
embed="embed-flag" />
<project id="project-id" />
</datasource>
</tsRequest>
HttpEntity entity = MultipartEntityBuilder.create()
.setMimeSubtype("mixed")
.addPart(FormBodyPartBuilder.create()
.setName("request_payload")
.setBody(new StringBody(document, ContentType.create("text/xml")))
.build())
.addPart(FormBodyPartBuilder.create()
.setName("tableau_datasource")
.setBody(new ByteArrayBody(file, "datasource-file-name"))
.build())
.build();

在这里,虽然我们发送了 ContentType.create("text/xml") StringBody 类对此进行编码并发送到服务器。我看到您正在调用 tableau 服务器,Tableau 将接受 xml。

Tableau 文档说如下 注意:不应对正在发布的内容进行编码(例如,使用 Base-64 或 UTF-8)。 请检查此文档:https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_concepts_publish.htm

找到球衣客户端 这有效。要推送到 Tableau 服务器的示例泽西客户端项目:https://github.com/tableau/rest-api-samples

相关内容

  • 没有找到相关文章

最新更新