Java 9 HttpClient с sendAsyncMulti / multiResponseAsync
Я пытаюсь экспериментировать с Java 9 HttpClient
,
Базовый пример, как в Javadoc HttpRequest, работает без проблем:
HttpResponse response = HttpRequest.create(new URI("http://stackru.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
, println
после join
не достигается, также нет никаких исключений, хотя я в основном скопировал пример из HttpResponse.multiFile
ага Я ожидал, что некоторые ответы HTTP будут сохранены в этом каталоге. Я также пытался удалить HTTP2 и followRedirects, другие URL-адреса, такие как Google и т. Д., Но это ничего не изменило. Что я делаю неправильно?
CompletableFuture<Map<URI,Path>> cf =
HttpRequest.create(new URI("http://stackru.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)
1 ответ
Метод sendAsyncMulti использует функцию HTTP2 с именем push-сообщения сервера.
Большинство клиентов http2, то есть современных браузеров, а также реализации в jdk9, используют новые функции только в том случае, если с хостом связываются через https.
Большинство http2-серверов будут отправлять push-обещания только в том случае, если первоначальный запрос клиента был запросом http2.
Следующий фрагмент кода работает с 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