如何创建包含多部分表单数据的可重复 POST 请求?

How to create a repeatable POST request that contains multipart-form-data?

我正在尝试创建一个 POST 请求,其中包含需要 NT Credentialsmultipart-form-data。身份验证请求导致 POST 被重新发送,我得到一个不可重复的实体异常。

我尝试包装由 BufferedHttpEntity 生成的 MultipartContent 实体,但它抛出 NullPointerExceptions?

final GenericUrl sau = new GenericUrl(baseURI.resolve("Record"));
final MultipartContent c = new MultipartContent().setMediaType(MULTIPART_FORM_DATA).setBoundary("__END_OF_PART__");
final MultipartContent.Part p0 = new MultipartContent.Part(new HttpHeaders().set("Content-Disposition", format("form-data; name=\"%s\"", "RecordRecordType")), ByteArrayContent.fromString(null, "C_APP_BOX"));
final MultipartContent.Part p1 = new MultipartContent.Part(new HttpHeaders().set("Content-Disposition", format("form-data; name=\"%s\"", "RecordTitle")), ByteArrayContent.fromString(null, "JAVA_TEST"));
c.addPart(p0);
c.addPart(p1);

ByteArrayContent 的文档说

Concrete implementation of AbstractInputStreamContent that generates repeatable input streams based on the contents of byte array.

使所有 部分 可重复并不能解决问题。因为这段代码 System.out.println("c.retrySupported() = " + c.retrySupported()); 输出 c.retrySupported() = true.

我找到了以下文档:

1.1.4.1. Repeatable entities An entity can be repeatable, meaning its content can be read more than once. This is only possible with self contained entities (like ByteArrayEntity or StringEntity)

我现在已经通过提取字符串内容将我的 MultipartContent 转换为具有 multi/part-form 媒体类型的 ByteArrayContent,但仍然出现相同的错误!

但是当我尝试调用 request.execute().

时仍然出现以下异常
Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entity.

那么我该如何说服 ApacheHttpTransport 创建一个可重复的实体?

如果多部分实体中所有部分的内容长度已知(返回非负值),则该实体将被视为可重复的。使多部分实体可重复的最简单方法是使其所有部分都可重复。

我必须修改从 HttpContent 继承的所有 类,以便它们可以使用 .retrySupported() 正确报告,以便输入 ApacheHttpTransport 代码时它会正确地创建可重复的内容。

更改是针对版本 1.20.0 进行的,因为那是我使用的版本。我正在提交针对 dev 分支 HEAD 的拉取请求,所以希望这个或这个版本的某个版本能进入下一个版本。

Here are the modifications that need to be merged in.