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

时间:2015-11-26 04:34:57

标签: apache-httpclient-4.x google-http-client

我正在尝试创建包含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. 创建一个可重复的实体呢?

2 个答案:

答案 0 :(得分:5)

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

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

Here are the modifications that need to be merged in.

答案 1 :(得分:0)

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