我正在使用ThreadSafeClientConnManager(Apache httpcomponents 4.1.1)创建的连接。响应被分块(我期望),由response.getEntity()决定.isChunked()
然而,没有办法获得页脚/预告片(这是我们的应用程序所必需的)。由于响应是分块的,我希望实体内容是ChunkedInputStream类型,但客户端使用的默认请求director和executor类包装原始响应实体(从查看httpcomponents源将是一个ChunkedInputStream)在BasicManagedEntity中。
简而言之,我不再能够从响应中获取页脚/预告片,因为BasicManagedEntity不会使底层实体可用。有谁知道如何解决这个问题?
供参考,见:
答案 0 :(得分:3)
可以使用HTTP响应拦截器来访问分块内容流和响应页脚。
httpclient.addResponseInterceptor(new HttpResponseInterceptor() {
public void process(
final HttpResponse response,
final HttpContext context) throws HttpException, IOException {
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
if (instream instanceof ChunkedInputStream) {
Header[] footers = ((ChunkedInputStream) instream).getFooters();
}
}
}
});
答案 1 :(得分:0)
如答案中所述,这可以在使用已弃用的 DefaultHttpClient 时完成。对于较新的未弃用的 HttpClient,存在一个错误 https://issues.apache.org/jira/browse/HTTPCLIENT-1992,它阻止在 4.5 版中访问预告片。此错误已在 5.0 中修复
因此在 v4.5 中,以下将不起作用。
CloseableHttpClient httpclient = HttpClients.custom().addInterceptorFirst(
(org.apache.http.HttpResponse response, HttpContext context) -> {
InputStream instream = response.getEntity().getContent();
if (instream instanceof ChunkedInputStream) {
//Code will never run for v4.5
}
}
).build();