微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Apache HTTP/2 客户端 5.0 POST 请求缺少有效负载/内容

如何解决Apache HTTP/2 客户端 5.0 POST 请求缺少有效负载/内容

我有一个部署到 Tomcat 的小示例 servlet,它将回显任何接收到的参数。 Tomcat 配置为支持 HTTP/1.1 和 HTTP/2。我可以使用 curl 向 servlet 发出 GET 请求,演示它可以在 HTTP/1.1 和 HTTP/2 上工作。

使用 Apache HTTP 5.0 客户端我有一个单元测试来命中 servlet 和 POST 一个带有一些参数(请求内容)的请求,该请求工作正常 - 服务器接收参数并将它们返回给客户端我可以阅读它们。在此测试中,我使用 CloseableHttpAsyncclient.setVersionPolicy() 调用调用客户端以使用 HTTP/1.1 或 HTTP/2。但是,如果我更改为使用 HTTP/2,则客户端不会将请求内容发送到服务器。

以下是成功调用 HTTP/1.1 的示例代码 - 您可以看到我有 setVersionPolicy(HttpVersionPolicy.FORCE_HTTP_1)。如果我将其更改为 FORCE_HTTP_2,则将通过 HTTP/2.0 进行调用,但不会发送请求内容

谁能建议我做错了什么或我需要做什么?我没有找到很多关于使用新的 Apache 5.0 客户端库的文档,并且示例没有显示发送和 POST 内容(或者至少我能找到的那些)。

    public void testWithHTTP1() throws Exception {

        final String content = "Code=99&Message=Hello";
        final String contentType = "application/text";

        final CloseableHttpAsyncclient client = HttpAsyncclients.custom()
                .setVersionPolicy(HttpVersionPolicy.FORCE_HTTP_1)
                .build();

        client.start();

        final HttpHost target = new HttpHost("http","localhost",8002);
        final String requestUri = "/VSFTestMT_Test/Test/Test_EchoHttpGet";

        final HttpClientContext clientContext = HttpClientContext.create();

        final SimpleHttpRequest httppost = SimpleHttpRequests.post(target,requestUri);     
        httppost.setBody(content,ContentType.create("application.x_www_form_urlencoded"));
        
        final Future<SimpleHttpResponse> future = client.execute(
                httppost,clientContext,new FutureCallback<SimpleHttpResponse>() {

                    @Override
                    public void completed(final SimpleHttpResponse response) {
                        System.out.println(requestUri + "->" + response.getCode());
                        System.out.println(response.getBody());
                    }

                    @Override
                    public void Failed(final Exception ex) {
                        System.out.println(requestUri + "->" + ex);
                    }

                    @Override
                    public void cancelled() {
                        System.out.println(requestUri + " cancelled");
                    }

                });


        System.out.println("Shutting down");
        client.close(CloseMode.GRACEFUL);
    }

解决方法

HTTP/1 可以通过 HTTP 和 HTTPS 实现,但对于 HTTP/2,它只能通过 HTTPS 实现。

据我所知,您只调用了 http url,这可能是 servlet 无法获取有效负载内容的原因

请查看更多detail

,

看起来他们有一个完全不同的 Http/2 构建器查看他们的源代码:

/**
 * Creates builder object for construction of custom HTTP/2
 * {@link CloseableHttpAsyncClient} instances optimized for HTTP/2 protocol
 * and message multiplexing
 */
public static H2AsyncClientBuilder customHttp2() {
    return H2AsyncClientBuilder.create();
}

/**
 * Creates HTTP/2 {@link CloseableHttpAsyncClient} instance with default configuration and
 * system properties optimized for HTTP/2 protocol and message multiplexing.
 */
public static CloseableHttpAsyncClient createHttp2System() {
    return H2AsyncClientBuilder.create().useSystemProperties().build();
}

因此我建议您尝试实际的customHttp2(),而不是custom()。

https://github.com/apache/httpcomponents-client/blob/master/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/HttpAsyncClients.java

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?