我想实现一个JAX-RS客户端,支持HTTP/1.1和HTTP/2。
如果服务器支持ALPN协议,就使用HTTP/2,如果服务器没有提供任何信息,则使用HTTP/1.1。
我已经阅读了一些关于ALPN的文章,它似乎是可能的,但我没有找到同时支持这些协议的任何支持。我无法将它们插入到一起。
我想实现一个JAX-RS客户端,支持HTTP/1.1和HTTP/2。
如果服务器支持ALPN协议,就使用HTTP/2,如果服务器没有提供任何信息,则使用HTTP/1.1。
我已经阅读了一些关于ALPN的文章,它似乎是可能的,但我没有找到同时支持这些协议的任何支持。我无法将它们插入到一起。
Java 11提供的Java HTTP客户端支持HTTP/1.1和HTTP/2(请参见Java HTTP客户端介绍)。
我使用它构建了一个连接器Jersey Connector,使用java.net.http.HttpClient
。您可以通过添加以下依赖项来使用它。
<dependency>
<groupId>com.github.nhenneaux.jersey.connector.httpclient</groupId>
<artifactId>jersey-httpclient-connector</artifactId>
<version>0.2.2</version>
</dependency>
HttpUrlConnection
HTTP1客户端。Jetty HTTP/1.1客户端也可以进行配置。我还编写了一个基于Jetty的HTTP/2客户端。然而,没有底层传输支持使用ALPN的HTTP/1.1和HTTP/2。 - Nicolas Henneaux从抽象的角度来看,您的问题似乎是想要一个Java servlet,可以协商并终止单个REST端点,从而避免为HTTP/1和HTTP/2分别提供接口,并避免外部终止,例如通过可以处理多种协议的代理。因此需要一个全能的servlet。
至少在2017年,Stuart(和JBoss的人员)已经在Undertow中实现了这一点,当时Steve Hu添加了测试用例和PR。1
您需要在OptionsMap中传递ENABLE_HTTP2选项。对于http URI,这意味着客户端将尝试在第一次请求时进行升级,对于https URI,ALPN将被用于尝试协商HTTP/2。这就是浏览器的行为方式,即使目标不支持HTTP/2也可以工作。2
看起来Simone正在推动更改以在Jetty中实现这一点。 3 因此,如果您现在想要这个功能,请从Jetty切换到Undertow,或将问题更改为“在Jetty中支持...”。
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<!--<version>5.0.0.Alpha2</version> -->
<version>4.1.29.Final</version>
</dependency>