2016-07-10 15 views
11

Próbuję eksperymentować z Javy 9 HttpClient.Java 9 HttpClient z sendAsyncMulti/multiResponseAsync

Podstawowym przykładem jak w HttpRequest's javadoc działa bez problemów:

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); 

Jednak gdy próbuje użyć sendAsyncMulti, to nie działa. Żadne pliki nie są tworzone w E:\foo, println po join nie jest osiągnięty, nie ma również wyjątku, chociaż zasadniczo skopiowałem przykład z HttpResponse.multiFile's Javadoc. Spodziewałem się, że niektóre odpowiedzi HTTP zostaną zapisane w tym katalogu. Próbowałem również usunąć HTTP2 i followRedirects, inne adresy URL, takie jak Google itp., Ale nic to nie zmieniło. Co ja robię źle?

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"); 

Jeśli jest to istotne, jest to wersja używam (najnowsza wersja 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) 
+0

zrobił kiedykolwiek to rozwiązałeś? – Jay

+0

@Jay: do tej pory nie. – user140547

+0

Witam. Stoję w obliczu dziwnej rzeczy. Moduł java.httpclient w ogóle nie istnieje w najnowszym JDK 9 (kompilacja 9-ea + 159) –

Odpowiedz

2

Sposób sendAsyncMulti posługuje się HTTP2-funkcja o nazwie naciśnięciem serwera.

Większość klientów http2, tj. Nowoczesne przeglądarki, a także implementacja w jdk9, używają tylko nowych funkcji, jeśli host jest kontaktowany przez https.

Większość serwerów http2 wysyła tylko te obietnice, jeśli początkowe żądanie klienta było żądaniem http2.

Poniższy urywek współpracuje z 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(); 

Pełne przykładem pracy można znaleźć na github: https://github.com/janweinschenker/jdk9-jigsaw-http2

Fragment pochodzi z https://github.com/janweinschenker/jdk9-jigsaw-http2/blob/master/src/main/java/de/holisticon/jdk9showcase/http2client/ResponseAsyncMultiExample.java