【发布时间】:2016-02-29 01:55:17
【问题描述】:
我正在尝试创建一个 POST 请求,其中包含需要 NT Credentials 的 multipart-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 的文档说
AbstractInputStreamContent 的具体实现,根据字节数组的内容生成可重复的输入流。
使所有部分可重复并不能解决问题。因为这段代码
System.out.println("c.retrySupported() = " + c.retrySupported()); 输出c.retrySupported() = true。
我找到了以下文档:
1.1.4.1。可重复的实体 一个实体可以是可重复的,这意味着它的内容可以被多次读取。这只有 self 才有可能 包含的实体(如 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 创建一个可重复的实体?
【问题讨论】:
标签: apache-httpclient-4.x google-http-client