HttpClient:禁用分块编码

7

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

有没有办法禁用客户端POST请求的分块编码?

3个回答

6
作为一般规则,如果要求不分块,则需要指定正文的确切大小。对于动态生成的数据,这意味着您需要在内存中缓冲整个响应,查看其大小,然后才发送它。
Apache客户端文档似乎证实了这一点:AbstractHttpEntity.setChunked()说明:
请注意,分块设置仅是提示。如果使用HTTP / 1.0,则永远不会执行分块操作。否则,即使分块为false,HttpClient也必须使用分块编码,如果实体内容长度未知(-1)。

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. 创建多部分POST请求时,不要提供InputStream作为附件的输入(因为对于HTTP 1.1会导致分块编码),而是提供一个字节数组,您必须事先从相同的流创建。这就是为什么内容长度是已知的。参见org.apache.http.entity.mime.MultipartEntityBuilder.addBinaryBody(String, byte[], ContentType, String)
我测试了Android开发,它需要稍微不同的类名...(见https://github.com/andstatus/andstatus/issues/249

2

如在Restlet邮件列表中所述,在Restlet 2.1版本中,您可以将ClientResource#entityBuffering属性设置为true,以将内容缓存在内存中并防止分块编码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接