我正在尝试使用Apache Commons的HttpClient发送带有二进制文件和几个字符串参数的多部分POST请求。
然而,似乎在某个地方,一些垃圾文本正在进入我的字符串参数。例如,通过调试器确认,sizeBody
变量确实保持值为“100”:
StringBody sizeBody = new StringBody("100", Charset.forName("UTF-8"));
但是,如果我通过Wireshark听取请求,我会看到:
--o2mm51iGsng9w0Pb-Guvf8XDwXgG7BPcupLnaa
Content-Disposition: form-data; name="x"
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
100
a5
--o2mm51iGsng9w0Pb-Guvf8XDwXgG7BPcupLnaa
请注意a5
之后的100
。
可能导致这种情况的原因是什么?我应该在哪里看?
答案 0 :(得分:1)
您所看到的可能是被调用的块传输编码[1]使用的块头。查看邮件头是否有Transfer-Encoding: chunked
字段。
答案 1 :(得分:0)
我有同样的问题测试我的POST,NanoHTTPD接收它们。实际上,HttpClient正在使用分块传输编码,NanoHTTPD不支持。在我的情况下这样做是因为二进制文件是通过InputStreamBody
提供的,因为它无法确定自己的内容长度(它只返回-1),所以客户端使用分块编码。
我切换到使用ByteArrayBody
作为文件内容,因此StringBody
可以提供内容长度,现在请求不使用分块编码。
ByteArrayOutputStream baos = new ByteArrayOutputStream();
IOUtils.copy (fileInputStream, baos); // from Apache Commons IO, or roll your own
ContentBody filePart = new ByteArrayBody (baos.toByteArray(), fileName);
当然,如果您的文件很大,如上所述将整个内容加载到字节数组中可能会导致内存问题。