我正在尝试创建包含POST
的{{1}}请求,该请求需要multipart-form-data
。身份验证请求导致重新发送NT Credentials
,并且我获得了不可重复的实体异常。
我尝试使用POST
包装生成的MultipartContent
实体,但它会抛出BufferedHttpEntity
?
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);
的文档说
AbstractInputStreamContent的具体实现,它根据字节数组的内容生成可重复的输入流。
使所有部分可重复并不能解决问题。因为这段代码
ByteArrayContent
输出System.out.println("c.retrySupported() = " + c.retrySupported());
。
我找到了以下文档:
1.1.4.1。可重复实体实体可以是可重复的,这意味着其内容可以被多次读取。这只能通过自我实现 包含的实体(如ByteArrayEntity或StringEntity)
我现在已经通过提取字符串内容将我的c.retrySupported() = true
转换为MultipartContent
ByteArrayContent
媒体类型,但仍然会收到同样的错误!
但是当我尝试拨打multi/part-form
时,我仍然遇到以下异常。
request.execute()
Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entity.
创建一个可重复的实体呢?答案 0 :(得分:5)
我必须修改从HttpContent
继承的所有类,以便他们能够使用.retrySupported()
正确报告,以便在输入ApacheHttpTransport
代码时正确创建可重复的内容
更改是针对版本1.20.0
进行的,因为我正在使用它。我正在针对dev
分支HEAD
提交拉取请求,所以希望这个版本或其中某个版本能够进入下一个版本。
答案 1 :(得分:0)
如果已知多部分实体中所有部分的内容长度(作为非负值返回),则该实体将被视为可重复。使多部分实体可重复的最简单方法是使其所有部分都可重复。