2011-10-11 49 views
2

我正在使用Apache Commons HttpClient以及Restlet来调用宁静的Web服务。不幸的是,我的服务器(基于Ruby on Rails)不喜欢HttpClient默认使用的Transfer-Encoding: chunkedHttpClient:禁用分块编码

有没有什么办法可以禁止来自客户端的邮件的分块编码的使用?

回答

2

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

4

作为一般规则,对于请求不被分块,您需要指定帖子主体的确切大小,对于动态生成的数据来说,这意味着您需要在内存中缓存整个响应,查看其大小,然后才发送它。

Apache的客户端文件似乎证实了这一点:AbstractHttpEntity.setChunked()状态

注意,分块设置只是一个提示。如果使用HTTP/1.0,分块永远不会执行。否则,即使分块为假,如果实体内容长度未知(-1),HttpClient也必须使用块编码。

1

最可靠的方式,正如@Slartibartfast在他的回答中暗示的,是明确将HttpPost切换为HTTP 1.0协议。

  1. 设置阿帕奇HttpPost请求HTTP 1.0协议(同样为HTTPGET,如果需要此...):

    HttpPost httpPost =新HttpPost(someUrl); httpPost.setProtocolVersion(HttpVersion.HTTP_1_0); //由于Apache HttpClient v.4.3

  2. 当创建多部分发布请求时,为附件提供一个输入,而不是InputStream(对于导致分块编码的HTTP 1.1),而是一个字节数组预先从相同的流创建。这就是为什么内容长度是已知的。见org.apache.http.entity.mime.MultipartEntityBuilder.addBinaryBody(字符串,字节[],则contentType,字符串)

我测试这对于Android开发,所需略有不同的类名...(见https://github.com/andstatus/andstatus/issues/249