HttpClient:禁用分块编码

时间:2011-10-11 04:59:07

标签: java http restlet apache-commons-httpclient

我正在使用Apache Commons HttpClient和Restlet来调用一个宁静的Web服务。不幸的是,我的服务器(基于Ruby on Rails)不喜欢HttpClient默认使用的Transfer-Encoding: chunked

有没有办法禁止从客户端使用分块编码用于POST?

3 个答案:

答案 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协议。

  1. 将apache HttpPost请求设置为HTTP 1.0协议(对于HttpGet也是如此,如果你需要这个......):

    HttpPost httpPost = new HttpPost(someUrl); httpPost.setProtocolVersion(HttpVersion.HTTP_1_0); //从Apache HttpClient v.4.3开始

  2. 创建Multipart post请求时,提供附件的输入而不是InputStream(对于HTTP 1.1,这会导致分块编码),而是一个字节数组,您必须事先从同一个流创建。这就是已知内容长度的原因。请参阅org.apache.http.entity.mime.MultipartEntityBuilder.addBinaryBody(String,byte [],ContentType,String)

  3. 我为Android开发进行了测试,这需要稍微不同的类名...(请参阅https://github.com/andstatus/andstatus/issues/249