有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java HttpClient:禁用分块编码

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

是否有任何方法可以禁用对来自客户端的帖子使用分块编码


共 (3) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    正如@Slartibartfast在他的回答中暗示的那样,最可靠的方法是显式地将HttpPost切换到http1.0协议

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

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

    2. 在创建多部分post请求时,为附件提供的输入不是InputStream(如HTTP 1.1,它会导致分块编码),而是一个字节数组,您必须事先从同一个流创建该数组。这就是内容长度已知的原因。见组织。阿帕奇。http。实体哑剧表演多部件生成器。addBinaryBody(字符串,字节[],内容类型,字符串)

    我在Android开发中测试了这个,需要稍微不同的类名。。。(见https://github.com/andstatus/andstatus/issues/249

  3. # 3 楼答案

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

    Apache客户端文档似乎证实了这一点:^{}声明

    Note that the chunked setting is a hint only. If using HTTP/1.0, chunking is never performed. Otherwise, even if chunked is false, HttpClient must use chunk coding if the entity content length is unknown (-1).