我正在使用Apache Commons HttpClient以及Restlet来调用宁静的Web服务。不幸的是,我的服务器(基于Ruby on Rails)不喜欢HttpClient默认使用的Transfer-Encoding: chunked
。HttpClient:禁用分块编码
有没有什么办法可以禁止来自客户端的邮件的分块编码的使用?
我正在使用Apache Commons HttpClient以及Restlet来调用宁静的Web服务。不幸的是,我的服务器(基于Ruby on Rails)不喜欢HttpClient默认使用的Transfer-Encoding: chunked
。HttpClient:禁用分块编码
有没有什么办法可以禁止来自客户端的邮件的分块编码的使用?
正如在Restlet邮件列表中所述,在Restlet 2.1版中,您可以将ClientResource#entityBuffering属性设置为true以缓存内存中的内容并防止分块编码。
作为一般规则,对于请求不被分块,您需要指定帖子主体的确切大小,对于动态生成的数据来说,这意味着您需要在内存中缓存整个响应,查看其大小,然后才发送它。
Apache的客户端文件似乎证实了这一点:AbstractHttpEntity.setChunked()
状态
注意,分块设置只是一个提示。如果使用HTTP/1.0,分块永远不会执行。否则,即使分块为假,如果实体内容长度未知(-1),HttpClient也必须使用块编码。
最可靠的方式,正如@Slartibartfast在他的回答中暗示的,是明确将HttpPost切换为HTTP 1.0协议。
设置阿帕奇HttpPost请求HTTP 1.0协议(同样为HTTPGET,如果需要此...):
HttpPost httpPost =新HttpPost(someUrl); httpPost.setProtocolVersion(HttpVersion.HTTP_1_0); //由于Apache HttpClient v.4.3
当创建多部分发布请求时,为附件提供一个输入,而不是InputStream(对于导致分块编码的HTTP 1.1),而是一个字节数组预先从相同的流创建。这就是为什么内容长度是已知的。见org.apache.http.entity.mime.MultipartEntityBuilder.addBinaryBody(字符串,字节[],则contentType,字符串)
我测试这对于Android开发,所需略有不同的类名...(见https://github.com/andstatus/andstatus/issues/249)