[英]How do I send Http trailers/footers in a chunked response from within a java servlet?
[英]How do I get chunked footers from a response on a connection that uses ThreadSafeClientConnManager?
我正在使用由 ThreadSafeClientConnManager (Apache httpcomponents 4.1.1) 创建的连接。 响应是分块的(我期望的),由 response.getEntity().isChunked() 确定
但是,没有办法获得页脚/拖车(这是我们的应用程序所必需的)。 由于响应是分块的,我希望实体内容的类型为 ChunkedInputStream,但是客户端使用的默认请求主管和执行程序类包装了原始响应实体(从查看 httpcomponents 源来看,它是一个 ChunkedInputStream)在 BasicManagedEntity 中。
简而言之,我不再能够从响应中获取页脚/拖车,因为 BasicManagedEntity 不会使基础实体可供使用。 有谁知道如何解决这个问题?
供参考,请参阅:
可以使用 HTTP 响应拦截器来访问分块内容 stream 和响应页脚。
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();
}
}
}
});
如答案中所述,这可以在使用已弃用的 DefaultHttpClient 时完成。 对于较新的未弃用 HttpClients,有一个错误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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.