我正在使用Apache Commons HttpClient和Restlet来调用一个宁静的Web服务。不幸的是,我的服务器(基于Ruby on Rails)不喜欢HttpClient默认使用的Transfer-Encoding: chunked
。
有没有办法禁止从客户端使用分块编码用于POST?
答案 0 :(得分:5)
作为一般规则,对于不被分块的请求,您需要指定post body的确切大小,对于动态生成的数据,这意味着您需要在内存中缓冲整个响应,查看其大小,然后才发送它。 / p>
Apache客户端文档似乎证实了这一点:AbstractHttpEntity.setChunked()
州
请注意,分块设置仅为提示。如果使用HTTP / 1.0,则永远不会执行分块。否则,即使chunked为false,如果实体内容长度未知(-1),HttpClient也必须使用块编码。
答案 1 :(得分:2)
如Restlet邮件列表中所述,在Restlet 2.1版中,您可以将ClientResource#entityBuffering属性设置为true以缓存内存中的内容并防止分块编码。
答案 2 :(得分:2)
正如@Slartibartfast在答案中暗示的那样,最可靠的方法是显式将HttpPost切换为HTTP 1.0协议。
将apache HttpPost请求设置为HTTP 1.0协议(对于HttpGet也是如此,如果你需要这个......):
HttpPost httpPost = new HttpPost(someUrl); httpPost.setProtocolVersion(HttpVersion.HTTP_1_0); //从Apache HttpClient v.4.3开始
创建Multipart post请求时,提供附件的输入而不是InputStream(对于HTTP 1.1,这会导致分块编码),而是一个字节数组,您必须事先从同一个流创建。这就是已知内容长度的原因。请参阅org.apache.http.entity.mime.MultipartEntityBuilder.addBinaryBody(String,byte [],ContentType,String)
我为Android开发进行了测试,这需要稍微不同的类名...(请参阅https://github.com/andstatus/andstatus/issues/249)