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

问题描述 投票:19回答:5

我想为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

java http jersey jetty http2
5个回答
0
投票

Java 11提供的Java HTTP客户端支持HTTP / 1.1和HTTP / 2(请参阅Introduction to the Java HTTP Client)。但是,它目前尚未与JAX-RS集成。它可能是构建JAX-RS连接器的好选择。


-1
投票

如果这个问题仍然有待提供,那么有一种方法可以用<JDK 9版本实现客户端。

如您所知,如果使用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>

-1
投票

实际上ALPN只是由JDK9 http://unrestful.io/2015/10/09/alpn-java.html开始的jdk支持。

那是JAX-RS客户端api无法处理的


-2
投票

解决方案可以是使用nginx(或apache2)作为反向代理来处理该需求。

Nginx可以代理您的jetty服务器(使用http / 1.1或仅http / 2协议)和服务器http / 2与alpn(使用最新版本)到客户端。


-2
投票

听起来你的问题是抽象的,你想要一个Java servlet而不是协商和终止单个REST端点,因此避免使用HTTP / 1的一个接口和HTTP / 2的另一个接口,并避免外部终止,例如通过代理可以处理多种协议。所以一个多功能的servlet。

这已经由Stuart(和JBoss人)在Undertow中实现,至少在2017年Steve Hu添加了测试用例和PR时。 1

您需要在OptionsMap中传入ENABLE_HTTP2选项。对于http URI,这意味着客户端将尝试升级第一个请求,因为https URI的ALPN将用于尝试和协商HTTP / 2。这就是浏览器的行为方式,即使目标不支持HTTP / 2也能正常工作。 2

看起来Simone正在推动改变以在Jetty中实现这一点。 3所以,如果您现在想要这个,请从Jetty切换到Undertow,或将问题更改为“支持...在Jetty中”。

© www.soinside.com 2019 - 2024. All rights reserved.