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

Ale*_*lex 5 java apache-httpcomponents

我正在尝试使用org.apache.http.entity.mime.MultipartEntityBuilder在multipart/form-data POST请求上模仿我的浏览器行为

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

我想要的(我的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
Run Code Online (Sandbox Code Playgroud)

我从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
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*lex 13

好吧 - 激烈的googeling终于产生了答案.

1)显然有些服务器与"Content-Transfer-Encoding"标头不兼容.

2)HttpComponents中有一个浏览器兼容模式,如下所示:

MultipartEntityBuilder uploadEntityBuilder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
Run Code Online (Sandbox Code Playgroud)

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

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