我正在尝试使用 org.apache.http.entity.mime.MultipartEntityBuilder 在 multipart/form-data POST 请求上模仿我的浏览器行为
我的浏览器只发送 Content-Disposition,但不发送 Content-Type 或 Content-Transfer-Encoding header 。 我尝试使用 MultipartEntityBuilder.addPart() 和 addTextBody() 但默认情况下都添加了这些 header :
我想要什么(我的 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
Why?: 指定服务器认为name="merkmal"之后的所有内容都是merkmal 的值(包括Headers)。其他可能的原因:整个请求是否有某种错误的编码(尤其是换行符)?
最佳答案
好的 - 激烈的谷歌搜索终于产生了答案。
1) 显然有些服务器不能很好地处理“Content-Transfer-Encoding” header 。
2)HttpComponents中有一个浏览器兼容模式是这样使用的:
MultipartEntityBuilder uploadEntityBuilder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
使用兼容性代码,不再使用两个不需要的 header (Content-Transfer-Encoding 和 Content-Type)!
我希望有一天这能帮助像我这样的可怜人 ;)
关于java - 多部分实体生成器 : Omit Content-Type and Content-Transfer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26000086/