HTTP/2 在 Java 中响应 Header

HTTP/2 Response Header in Java

是否已经有办法在 Java 中获得 HTTP/2 响应 header?我尝试在一些库中搜索,例如 URLConnection、Undertow 甚至 Jetty,但都没有成功。

P.S.: 我在我的 Java 项目上使用 JDK 1.7。

另外,HTTP/2的回复header是这样的?

 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 中的响应 header项目?

谢谢。

HTTP/2 网站通常使用 TLS,因为浏览器仅支持 HTTP/2 over TLS。

您尝试使用的方法是 HTTP/1.1 升级到 HTTP/2,只有极少数网站(如果有的话)支持。

您的代码片段代表一个请求,而不是响应。 如果升级成功,HTTP/2 服务器会以 HTTP/1.1 格式发回 101 响应 GET 请求的响应 [= =32=]格式。这在 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。

请记住,要使该代码正常工作,您必须使用 JDK 8 和引导类路径中正确的 ALPN 引导 jar,如指定的那样 here