MultipartEntityBuilder:省略内容类型和内容传输

时间:2014-09-23 16:24:50

标签: java apache-httpcomponents

我尝试使用org.apache.http.entity.mime.MultipartEntityBuilder

模仿我在多部分/表单数据POST请求上的浏览器行为

我的浏览器只发送Content-Disposition,但没有Content-Type或Content-Transfer-Encoding标头。 我尝试使用MultipartEntityBuilder.addPart()和addTextBody(),但默认情况下都添加了这些标题:

我想要什么(我的Chrome浏览器的功能):

POST .../some.jsp HTTP/1.1
Host: ...
Connection: keep-alive
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary6tcnkxC7txvqE5Xl


------WebKitFormBoundary6tcnkxC7txvqE5Xl
Content-Disposition: form-data; name="merkmal"

5

我从MultipartEntityBuilder获得的内容

POST.../some.jsp HTTP/1.1
Host: ...
Content-Type: multipart/form-data; boundary=m9Zb2QD-QaH-j-HqgGQfI8KwDkToz17ULYkZ

--m9Zb2QD-QaH-j-HqgGQfI8KwDkToz17ULYkZ
Content-Disposition: form-data; name="merkmal"
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit

5

为什么?:指定的服务器认为名字后面的所有内容=" merkmal"是merkmal(包括Headers)的价值。其他可能的原因:整个请求可能有某种错误的编码(特别是换行)?

1 个答案:

答案 0 :(得分:13)

好吧 - 激烈的googeling终于得到了答案。

1)显然有些服务器与“Content-Transfer-Encoding”标头不兼容。

2)HttpComponents中有一个浏览器兼容模式,使用方式如下:

MultipartEntityBuilder uploadEntityBuilder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

使用兼容性代码,不再使用不需要的标头(Content-Transfer-Encoding和Content-Type)!

我希望有一天会像我一样帮助一些可怜的人;)