我尝试使用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)的价值。其他可能的原因:整个请求可能有某种错误的编码(特别是换行)?
答案 0 :(得分:13)
1)显然有些服务器与“Content-Transfer-Encoding”标头不兼容。
2)HttpComponents中有一个浏览器兼容模式,使用方式如下:
MultipartEntityBuilder uploadEntityBuilder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
使用兼容性代码,不再使用不需要的标头(Content-Transfer-Encoding和Content-Type)!
我希望有一天会像我一样帮助一些可怜的人;)