7

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

我尝试包装MultipartContent用 a 生成的实体,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);

文档ByteArrayContent

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

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

我找到了以下文档:

1.1.4.1。可重复的实体 一个实体可以是可重复的,这意味着它的内容可以被多次读取。这仅适用于自包含实体(如 ByteArrayEntity 或 StringEntity)

我现在通过提取字符串内容将 my 转换MultipartContentByteArrayContent具有multi/part-form媒体类型的 a ,但仍然得到相同的错误!

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

Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entity.

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

4

2 回答 2

5

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

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

以下是需要合并的修改。

于 2015-12-03T18:35:37.690 回答
0

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

于 2015-11-26T09:24:38.583 回答