是否已经有办法在Java中获取HTTP / 2响应头?我试图搜索URLConnection,Undertow甚至Jetty等一些库,但没有成功。
P.S。:我在我的Java项目中使用JDK 1.7。
另外,HTTP / 2的响应头是这样的吗?
GET / HTTP/1.1
Host: server.example.com
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload>
是否有任何网站使用此版本?
我的主要目标是了解网站是否使用HTTP / 2版本,有没有办法知道这一点而无需在Java项目中读取响应头?
感谢。
答案 0 :(得分:0)
HTTP / 2网站通常使用TLS,因为浏览器仅通过TLS支持HTTP / 2。
您尝试使用的方法是HTTP / 1.1升级到HTTP / 2,很少有网站(如果有的话)支持。
您的代码段代表请求,而不是回复。
如果升级成功,HTTP / 2服务器将以HTTP / 1.1格式发回101响应,并以HTTP / 2格式发送对GET
请求的响应。这在RFC 7540, section 3.2中指定。
为了实现您想要的目标,即了解网站是否支持HTTP / 2,您必须尝试使用HTTP / 2 + TLS进行连接。如果连接成功,则表示支持HTTP / 2。如果失败,则不支持。
对于Jetty(免责声明,我是HTTP / 2模块维护者),您必须使用JDK 8,代码如下所示:
// Setup.
HTTP2Client http2Client = new HTTP2Client();
SslContextFactory sslContextFactory = new SslContextFactory();
HttpClient httpClient = new HttpClient(new HttpClientTransportOverHTTP2(http2Client), sslContextFactory);
httpClient.start();
// Does webtide.com support HTTP/2 ?
ContentResponse response = httpClient.GET("https://webtide.com/");
// No errors, yes it supports HTTP/2 !
如果您收到没有错误的响应,则表示您使用HTTP / 2,否则服务器不支持HTTP / 2.
请记住,要使该代码生效,您必须在bootclasspath中使用JDK 8和正确的ALPN引导jar,如指定的here。