Apache 或其他一些 CLIENT JAVA 实现是否支持 HTTP/2?

2024-03-02

我正在寻找可以连接到基于 HTTP/2 的服务器的 java 客户端。该服务器已经支持 HTTP/2 API。我没有看到最流行的 Apache Http 客户端https://hc.apache.org/ https://hc.apache.org/仍然支持 HTTP/2。

Apache 是否已经有一些支持 Http/2 的 Java 客户端实现?

如果没有,是否有一些 java 客户端支持连接到 HTTP/2(最好在 Java 7 上)?


Jetty https://www.eclipse.org/jetty/提供了两个 HTTP/2 Java 客户端 API。两者都需要 Java 8(或更高版本)并且强制使用 ALPN,如所解释的here https://www.eclipse.org/jetty/documentation/current/alpn-chapter.html.

低级 API

这些API基于HTTP2客户端 http://download.eclipse.org/jetty/stable-9/apidocs/org/eclipse/jetty/http2/client/HTTP2Client.html,它基于 HTTP/2 的概念session and streams并使用侦听器来通知 HTTP/2frames从服务器到达的。

    // Setup and start the HTTP2Client.
    HTTP2Client client = new HTTP2Client();
    SslContextFactory sslContextFactory = new SslContextFactory();
    client.addBean(sslContextFactory);
    client.start();

    // Connect to the remote host to obtains a Session.
    FuturePromise<Session> sessionPromise = new FuturePromise<>();
    client.connect(sslContextFactory, new InetSocketAddress(host, port), new ServerSessionListener.Adapter(), sessionPromise);
    Session session = sessionPromise.get(5, TimeUnit.SECONDS);

    // Use the session to make requests.
    HttpFields requestFields = new HttpFields();
    requestFields.put("User-Agent", client.getClass().getName() + "/" + Jetty.VERSION);
    MetaData.Request metaData = new MetaData.Request("GET", new HttpURI("https://webtide.com/"), HttpVersion.HTTP_2, requestFields);
    HeadersFrame headersFrame = new HeadersFrame(metaData, null, true);
    session.newStream(headersFrame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
    {
        @Override
        public void onHeaders(Stream stream, HeadersFrame frame)
        {
            // Response headers.
            System.err.println(frame);
        }

        @Override
        public void onData(Stream stream, DataFrame frame, Callback callback)
        {
            // Response content.
            System.err.println(frame);
            callback.succeeded();
        }
    });

高级 API

Jetty's HttpClient提供了一种使用方法不同的交通工具 https://webtide.com/pluggable-transports-for-jetty-9-1s-httpclient/,其中之一是HTTP/2 传输 https://webtide.com/http2-support-for-httpclient/。应用程序将使用更高级别的 HTTP API,但在底层 Jetty 将使用 HTTP/2 来传输 HTTP 语义。

这样,应用程序就可以使用由HttpClient透明地,并考虑在配置或启动代码中使用什么传输。

    // Setup and start HttpClient with HTTP/2 transport.
    HTTP2Client http2Client = new HTTP2Client();
    SslContextFactory sslContextFactory = new SslContextFactory();
    HttpClient httpClient = new HttpClient(new HttpClientTransportOverHTTP2(http2Client), sslContextFactory);
    httpClient.start();

    // Make a request.
    ContentResponse response = httpClient.GET("https://webtide.com/");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apache 或其他一些 CLIENT JAVA 实现是否支持 HTTP/2? 的相关文章

随机推荐