我正在尝试使用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());
请求挂在上面指示的行。似乎代码正试图在获得响应之前发送整个请求。回想起来,这是有道理的。然而,这不是我所希望的。:)
相反,我希望使用 发送请求标头Transfer-Encoding: chunked
,接收HTTP/1.1 200 OK
带有Transfer-Encoding: chunked
自己标头的响应标头,然后我将使用全双工流式 HTTP 连接。
令人高兴的是,我的 HTTPClient 有另一个基于 NIO 的异步客户端,有很好的使用示例(比如这个)。我的问题是:
- 我对同步 HTTPClient 行为的解释是否正确?或者我可以做些什么来以我描述的方式继续使用(更简单的)同步 HTTPClient ?
- 基于 NIO 的客户端是否在寻求响应之前等待发送整个请求?还是我能够以增量方式发送请求并同时以增量方式接收响应?
如果 HTTPClient 不支持这种方式,是否还有另一个 HTTP 客户端库可以支持?还是我应该计划编写一个(最小的)HTTP 客户端来支持这种方式?