【发布时间】:2020-07-15 06:35:11
【问题描述】:
我安装了Apache httpcomponents-client-5.0.x,在查看http响应的标头时,我很震惊它没有显示Content-Length和Content-Encoding标头,这是我用于测试的代码
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import com.sun.net.httpserver.Headers;
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet request = new HttpGet(new URI("https://www.example.com"));
CloseableHttpResponse response = httpclient.execute(request);
Header[] responseHeaders = response.getHeaders();
for(Header header: responseHeaders) {
System.out.println(header.getName());
}
// this prints all the headers except
// status code header
// Content-Length
// Content-Encoding
无论我尝试什么,我都会得到相同的结果,就像这样
Iterator<Header> headersItr = response.headerIterator();
while(headersItr.hasNext()) {
Header header = headersItr.next();
System.out.println(header.getName());
}
或者这个
HttpEntity entity = response.getEntity();
System.out.println(entity.getContentEncoding()); // NULL
System.out.println(entity.getContentLength()); // -1
根据 6 年前问过的this question,即使使用旧版本的 Apache HttpClient,这似乎也是一个老问题。
当然,正如 Wireshark 所确认的那样,服务器实际上正在返回这些标头,并且 Apache HttpClient 会自行记录
2020-04-03 07:59:09,106 DEBUG [org.apache.hc.client5.http.headers] http-outgoing-0 << HTTP/1.1 200 OK
2020-04-03 07:59:09,106 DEBUG [org.apache.hc.client5.http.headers] http-outgoing-0 << Content-Encoding: gzip
2020-04-03 07:59:09,106 DEBUG [org.apache.hc.client5.http.headers] http-outgoing-0 << Accept-Ranges: bytes
2020-04-03 07:59:09,107 DEBUG [org.apache.hc.client5.http.headers] http-outgoing-0 << Age: 451956
2020-04-03 07:59:09,107 DEBUG [org.apache.hc.client5.http.headers] http-outgoing-0 << Cache-Control: max-age=604800
2020-04-03 07:59:09,107 DEBUG [org.apache.hc.client5.http.headers] http-outgoing-0 << Content-Type: text/html; charset=UTF-8
2020-04-03 07:59:09,107 DEBUG [org.apache.hc.client5.http.headers] http-outgoing-0 << Date: Fri, 03 Apr 2020 05:59:09 GMT
2020-04-03 07:59:09,108 DEBUG [org.apache.hc.client5.http.headers] http-outgoing-0 << Etag: "3147526947+gzip"
2020-04-03 07:59:09,108 DEBUG [org.apache.hc.client5.http.headers] http-outgoing-0 << Expires: Fri, 10 Apr 2020 05:59:09 GMT
2020-04-03 07:59:09,108 DEBUG [org.apache.hc.client5.http.headers] http-outgoing-0 << Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
2020-04-03 07:59:09,108 DEBUG [org.apache.hc.client5.http.headers] http-outgoing-0 << Server: ECS (dcb/7EEB)
2020-04-03 07:59:09,108 DEBUG [org.apache.hc.client5.http.headers] http-outgoing-0 << Vary: Accept-Encoding
2020-04-03 07:59:09,109 DEBUG [org.apache.hc.client5.http.headers] http-outgoing-0 << X-Cache: HIT
2020-04-03 07:59:09,109 DEBUG [org.apache.hc.client5.http.headers] http-outgoing-0 << Content-Length: 648
顺便说一句,java.net.http 库称为 JDK HttpClient 效果很好,可以显示所有标题。
是我做错了什么,还是应该报告一个存在多年的错误?
【问题讨论】:
-
检查4.x版本是否有同样的问题
-
HttpClient 4.x 的行为在设计上完全相同。如果有人不想要透明内容压缩,可以在构建 HttpClient 时轻松禁用它
-
@ok2c 谢谢我已经阅读了你的答案here,是的,这个解决方案会阻止HttpClient自动发送
Accept-Encoding头,如果我手动设置这个头,HttpClient不会解压响应内容,有没有办法让响应解压缩并且响应标头也可以?我应该问另一个问题吗? -
@Accountantم 这些标题被删除是有充分理由的。但是,如果您绝对确定可以将标准
ContentCompressionExec替换为自定义 exec 拦截器。 -
@ok2c 这似乎是一个痛苦的工作,我会检查它,但如果它真的很难做到,我没有办法,只能牺牲那些标题:(
标签: java debugging apache-httpclient-4.x apache-httpcomponents apache-httpclient-5.x