我想为JAX-RS客户端实现支持HTTP / 1.1和HTTP / 2的JAX-RS客户端。
如果服务器支持带有HTTP / 2的ALPN,则使用HTTP / 2,如果服务器不提供任何信息,则使用HTTP / 1.1。
我已经阅读了一些关于ALPN的文章,这似乎是可能的,但我没有找到同时支持这些协议的任何内容。我没有把这些插在一起。
我目前正在使用Jetty HTTP/1.1 transport connector for Jersey和custom implementation for HTTP/2 transport connector。
答案 0 :(得分:1)
Java 11随附的Java HTTP客户端支持HTTP / 1.1和HTTP / 2(请参阅Introduction to the Java HTTP Client)。
我已使用Jersey Connector using java.net.http.HttpClient
建立了一个连接器。
您可以使用它添加以下依赖项。
<dependency>
<groupId>com.github.nhenneaux.jersey.connector.httpclient</groupId>
<artifactId>jersey-httpclient-connector</artifactId>
<version>0.1.1</version>
</dependency>
答案 1 :(得分:0)
https://github.com/nhenneaux/jaxrs-http2-example
看一下这个例子,但要确保没有异步调用。
答案 2 :(得分:0)
解决方案可能是使用nginx(或apache2)作为反向代理来处理该要求。
Nginx可以代理您的码头服务器(使用http / 1.1或http / 2仅protcol)和服务器http / 2与alpn(使用最新版本)代理客户端。
答案 3 :(得分:0)
事实上,ALPN仅支持jdk从JDK9开始 http://unrestful.io/2015/10/09/alpn-java.html
JAX-RS客户端api无法处理
答案 4 :(得分:0)
如果这个问题仍然可以解决,那么有一种方法可以用 您知道,如果使用TLSv1.2(h2),HTTP / 2需要ALPN支持。 netty程序包对HTTP / 2提供了一些支持,前提是您已在平台上安装了openssl(版本1.0.2或更高版本)。 Netty软件包将通过调用本机库将OpenSSL用于ALPN支持。 我们用JDK8实现了一个客户端,并设法生成http2请求进行操作,其中服务器仅接受http2请求。我们使用了下面提到的依赖项 <dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<!--<version>5.0.0.Alpha2</version> -->
<version>4.1.29.Final</version>
</dependency>
答案 5 :(得分:-1)
听起来您的问题是抽象的,您是否想要Java servlet,而不是可以协商和终止单个REST端点,因此避免使用HTTP / 1接口,而避免使用HTTP / 2接口,并避免在外部终止,例如通过可以处理多种协议的代理。所以是一个多合一的servlet。
至少在2017年,当史蒂夫·胡(Steve Hu)添加测试用例和PR时,这已经由Stuart(和JBoss员工)在Undertow中实现。 1
您需要在OptionsMap中传递ENABLE_HTTP2选项。对于 http URI,这意味着客户端将尝试升级 第一个请求,用于https URI的ALPN的尝试和协商 HTTP / 2。这是浏览器的行为,即使目标 不支持HTTP / 2。 2
Simone似乎正在推动更改以在Jetty中实现此目标。 3因此,如果您现在要这样做,请从Jetty切换到Undertow,或将问题更改为“在Jetty中支持...”。