Apache HTTPClient流式HTTP POST请求?

sig*_*ned 6 java http apache-httpclient-4.x

我正在尝试使用Apache HTTPClient构建"全双工"HTTP流式传输请求.

在我的第一次尝试中,我尝试使用以下请求代码:

URL url=new URL(/* code goes here */);

HttpPost request=new HttpPost(url.toString());

request.addHeader("Connection", "close");

PipedOutputStream requestOutput=new PipedOutputStream();
PipedInputStream requestInput=new PipedInputStream(requestOutput, DEFAULT_PIPE_SIZE);
ContentType requestContentType=getContentType();
InputStreamEntity requestEntity=new InputStreamEntity(requestInput, -1, requestContentType);
request.setEntity(requestEntity);

HttpEntity responseEntity=null;
HttpResponse response=getHttpClient().execute(request); // <-- Hanging here
try {
    if(response.getStatusLine().getStatusCode() != 200)
        throw new IOException("Unexpected status code: "+response.getStatusLine().getStatusCode());

    responseEntity = response.getEntity();
}
finally {
    if(responseEntity == null)
        request.abort();
}

InputStream responseInput=responseEntity.getContent();
ContentType responseContentType;
if(responseEntity.getContentType() != null)
    responseContentType = ContentType.parse(responseEntity.getContentType().getValue());
else
    responseContentType = DEFAULT_CONTENT_TYPE;

Reader responseStream=decode(responseInput, responseContentType);
Writer requestStream=encode(requestOutput, getContentType());
Run Code Online (Sandbox Code Playgroud)

请求挂在上面指定的行.似乎代码试图在获得响应之前发送整个请求.回想起来,这是有道理的.但是,这不是我所希望的.:)

相反,我希望发送请求标头Transfer-Encoding: chunked,接收HTTP/1.1 200 OK带有Transfer-Encoding: chunked自己标头的响应标头,然后我将使用全双工流HTTP连接.

令人高兴的是,我的HTTPClient有另一个基于NIO的异步客户端,它有很好的用法示例(比如这个).我的问题是:

  1. 我对同步HTTPClient行为的解释是否正确?或者我能做些什么来继续以我描述的方式使用(更简单的)同步HTTPClient?
  2. 在寻求响应之前,基于NIO的客户端是否等待发送整个请求?或者我能够逐步发送请求并同时以增量方式接收响应吗?

如果HTTPClient不支持这种模式,那么会有另一个HTTP客户端库吗?或者我应该计划编写一个(最小的)HTTP客户端来支持这种模式?

Chr*_*ris 1

以下是我对略读代码的看法:

  1. 我不能完全同意非 200 响应就意味着失败这一事实。所有 2XX 响应大部分都是有效的。查看wiki了解更多详细信息

  2. 对于任何 TCP 请求,我建议接收完整响应以确认其有效。我这样说是因为,部分响应可能大多被视为不良响应,因为大多数客户端实现无法使用它。(想象一下服务器响应 2MB 数据的情况,并且在此期间发生故障)