带有 sendAsyncMulti/multiResponseAsync 的 Java 9 HttpClient

标签 java java-9 java-http-client

我正在尝试使用 Java 9 的 HttpClient

HttpRequest's javadoc中的基本示例工作没有问题:

HttpResponse response = HttpRequest.create(new URI("http://stackoverflow.com/"))
       .version(java.net.http.HttpClient.Version.HTTP_2)
       .followRedirects(HttpClient.Redirect.ALWAYS)
       .GET()
       .response();

       int statusCode = response.statusCode();
       String responseBody = response.body(HttpResponse.asString());

       System.out.println("statusCode = " + statusCode);
       System.out.println("responseBody = " + responseBody);

但是,当尝试使用 sendAsyncMulti 时,它不起作用。 E:\foo没有创建文件,join后的println也没有到,也没有异常,虽然我基本上是复制了来自 HttpResponse.multiFile's Javadoc 的示例.我预计一些 HTTP 响应将保存在该目录中。我还尝试删除 HTTP2 和 followRedirects,其他 URL,如 google 等,但它没有改变任何东西。我做错了什么?

CompletableFuture<Map<URI,Path>> cf =
    HttpRequest.create(new URI("http://stackoverflow.com/"))
        .version(java.net.http.HttpClient.Version.HTTP_2)
        .followRedirects(HttpClient.Redirect.ALWAYS)
        .GET()
        .multiResponseAsync(HttpResponse.multiFile(Paths.get("E:\\foo")));
Map<URI,Path> results = cf.join();
System.out.println("after join");

如果相关,这是我使用的版本(JDK 9 的最新版本):

java version "9-ea"
Java(TM) SE Runtime Environment (build 9-ea+126)
Java HotSpot(TM) Server VM (build 9-ea+126, mixed mode)

最佳答案

sendAsyncMulti 方法使用名为服务器推送的 HTTP2 功能。

大多数 http2 客户端,即现代浏览器以及 jdk9 中的实现,仅在通过 https 联系主机时才使用新功能。

如果初始客户端请求是 http2 请求,大多数 http2 服务器只会发送推送 promise 。

以下代码片段适用于 java 9 build 9-ea-153:

URI uri = new URI("https://blog.cloudflare.com/announcing-support-for-http-2-server-push-2/");
HttpRequest request = ExampleUtils.createHttpRequest(uri);
HttpClient client = ExampleUtils.createHttpClient();

MultiMapResult<String> multiMapResult = client.sendAsync(request, MultiProcessor.asMap((req) -> {
            Optional<BodyHandler<String>> optional = Optional.of(HttpResponse.BodyHandler.asString());
            if (optional.isPresent()) {
                System.out.println(" - " + req.uri());
            }
            return optional;
        }, false))

        .orTimeout(2, TimeUnit.SECONDS)
        .join();

完整的工作示例可以在 github 上找到:https://github.com/janweinschenker/jdk9-jigsaw-http2

片段摘自https://github.com/janweinschenker/jdk9-jigsaw-http2/blob/master/src/main/java/de/holisticon/jdk9showcase/http2client/ResponseAsyncMultiExample.java

关于带有 sendAsyncMulti/multiResponseAsync 的 Java 9 HttpClient,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38293545/

相关文章:

java - Spring SpEL。如何将字段的默认值设置为null

java - 如何为字符串到文件句柄的映射创建清理器?

java - spring中如何定义命名空间

java - 无法使用输出流发送命令

java - 是否有从 inputText 到 URL 的任何标准 JSF 转换器?

java - 使用 Java EE API 替换已弃用的 JPMS 模块

junit - 如何在不模拟 Doclet API 的情况下测试 Java 9+ doclet?

java - 我正在尝试通过实现异步任务在 android (java) 中流式传输 chatgpt api 的响应(逐字),但我收到错误

java - java.net.HttpClient 上是否有任何连接池处理?

java - 如何在 Java HTTP Client 中设置套接字超时