使用JAX-RS客户端支持HTTP / 1.1和HTTP / 2

时间:2017-02-20 15:10:58

标签: java http jersey jetty http2

我想为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 Jerseycustom implementation for HTTP/2 transport connector

6 个答案:

答案 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>

Maven Central

答案 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中支持...”。