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



我正在尝试创建一个包含需要NT Credentialsmultipart-form-dataPOST请求。身份验证请求导致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的文档显示

AbstractInputStreamContent的具体实现,它基于字节数组的内容生成可重复的输入流。

使所有部件可重复并不能解决问题。因为这个代码9输出CCD_ 10。

我发现了以下文档:

1.1.4.1.可重复实体实体可以是可重复的,这意味着其内容可以被多次读取。这只有自我才能实现包含实体(如ByteArrayEntity或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版本进行的,因为我使用的是CCD_19。我正在提交一个针对dev分支HEAD的拉取请求,所以希望这个或它的某个版本能进入下一个版本。

以下是需要合并到中的修改。

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

相关内容

  • 没有找到相关文章

最新更新