我正在尝试使用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
's Javadoc复制示例,但没有在println
中创建文件,没有到达join
之后的HttpResponse.multiFile
,也没有异常(exception)。我希望一些HTTP响应将保存在该目录中。我还尝试删除了HTTP2和followRedirects,以及其他类似google的URL,但它并没有改变任何内容。我究竟做错了什么?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/