Подтвердить что ты не робот

Java 9 HttpClient с sendAsyncMulti/multiResponseAsync

Я пытаюсь поэкспериментировать с Java 9 HttpClient.

Основной пример, как в HttpRequest 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 файлы не создаются, println после join не достигается, также нет исключения, хотя я в основном скопировал пример из HttpResponse.multiFile 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)
4b9b3361

Ответ 1

Метод sendAsyncMulti использует HTTP2-функцию с именем server push.

Большинство клиентов http2, то есть современных браузеров, а также реализация в jdk9, используют только новые функции, если с хостом связывается через https.

Большинство HTTP2-серверов будут отправлять только push promises, если первоначальный запрос клиента был запросом 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