Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HttpClient:禁用分块编码_Java_Http_Restlet_Apache Commons Httpclient - Fatal编程技术网

Java HttpClient:禁用分块编码

Java HttpClient:禁用分块编码,java,http,restlet,apache-commons-httpclient,Java,Http,Restlet,Apache Commons Httpclient,我正在使用ApacheCommonsHttpClient和Restlet来调用RESTfulWeb服务。不幸的是,我的服务器(基于RubyonRails)不喜欢HttpClient默认使用的传输编码:chunked 有没有办法禁止对来自客户端的帖子使用分块编码?作为一般规则,对于不分块的请求,您需要指定帖子正文的确切大小,对于动态生成的数据,这意味着您需要在内存中缓冲整个响应,查看其大小,然后发送它 Apache客户端文档似乎证实了这一点:状态 请注意,chunked设置只是一个提示。如果使用H

我正在使用ApacheCommonsHttpClient和Restlet来调用RESTfulWeb服务。不幸的是,我的服务器(基于RubyonRails)不喜欢HttpClient默认使用的
传输编码:chunked


有没有办法禁止对来自客户端的帖子使用分块编码?

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

Apache客户端文档似乎证实了这一点:状态

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


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

最可靠的方法,正如@Slartibartfast在其回答中所暗示的,是显式地将HttpPost切换到HTTP 1.0协议

  • 将apache HttpPost请求设置为HTTP 1.0协议(如果需要,HttpGet也是如此…):

    HttpPost HttpPost=新的HttpPost(someUrl); httpPost.setProtocolVersion(HttpVersion.HTTP_1_0);//从Apache HttpClient的第4.3版开始

  • 在创建多部分post请求时,为附件提供的输入不是InputStream(如HTTP 1.1,它会导致分块编码),而是一个字节数组,您必须事先从同一个流创建该数组。这就是内容长度已知的原因。请参见org.apache.http.entity.mime.MultipartEntityBuilder.addBinaryBody(字符串,字节[],内容类型,字符串)

  • 我在Android开发中测试了这个,需要稍微不同的类名。。。(见附件)