java - 使用 Apache HttpClient 发布 MultipartEntity 时,ByteArrayBody 可以工作,但 InputStreamBody 会抛出 NoHttpResponseException

标签 java http apache-httpclient-4.x

我正在尝试发布从输入流中获取的一些数据。我希望避免首先将所有数据收集到字节数组中,而是流式传输数据,以节省内存(我正在发布大约 10MB 的数据)。

如果我运行以下命令:

DefaultHttpClient httpclient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(target_url);
MultipartEntity entity = new MultipartEntity();
entity.addPart("data", new InputStreamBody(new ByteArrayInputStream(new byte[1]), 
    filename));
httpPost.setEntity(entity);
httpclient.execute(httpPost);

然后我得到:

org.apache.http.NoHttpResponseException: The target server failed to respond
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:95)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:62)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:254)
at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:289)
at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:252)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseHeader(ManagedClientConnectionImpl.java:191)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:300)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:127)
at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:712)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:517)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784)
    [my code starts here]

但是,如果我更改上面的一行,将 InputStreamBody 替换为等效的 ByteArrayBody,那么一切都很好:

entity.addPart("data", new ByteArrayBody(new byte[1], filename));

我做错了什么?

(InputStreamBody 是否真的会传输数据,还是我在浪费时间?)

我正在使用 HttpClient-4.2.1

最佳答案

你所做的事情没有任何问题。问题可能是,当使用 ByteArrayBody 时,HttpClient 能够计算总请求内容长度并使用 Content-Length 描述消息,而当使用 InputStreamBody 时 HttpClient 必须求助于内容分块(使用 Transfer-Encoding header )。我怀疑服务器端脚本根本无法处理没有 Content-Length header 的请求。

关于java - 使用 Apache HttpClient 发布 MultipartEntity 时,ByteArrayBody 可以工作,但 InputStreamBody 会抛出 NoHttpResponseException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11634038/

相关文章:

java - 在 Java 中调用方法 - Hello World 示例

javascript - 为什么这个 d3.text 请求失败了?

angularjs - 在 Angularjs 中处理 $http.get 和 $http.post 错误

Android HttpClient、DefaultHttpClient、HttpPost

java - Apache HTTP Client 和代理的条件设置

java - 如何使用HTTP-GET连接输入用户名和密码访问API

java - 如何将外部页面添加到 Java 代码文档中?

java - NoSuchMethodError : scala. collection.mutable.Buffer$.empty()Lscala/collection/GenTraversable

ruby-on-rails - 在 Rails 中模拟网络响应

Java http 客户端和 POODLE