2016-07-10 10 views
11

Ich versuche, mit Java 9 HttpClient zu experimentieren.Java 9 HttpClient mit sendAsyncMulti/multiResponseAsync

Das grundlegende Beispiel wie in HttpRequest's javadoc Arbeiten ohne Probleme:

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

jedoch bei dem Versuch, sendAsyncMulti zu verwenden, funktioniert es nicht. Es werden keine Dateien in E:\foo erstellt, die println werden nach join nicht erreicht, es gibt auch keine Ausnahme, obwohl ich das Beispiel grundsätzlich von HttpResponse.multiFile's Javadoc kopiert habe. Ich habe erwartet, dass einige HTTP-Antworten in diesem Verzeichnis gespeichert werden. Ich habe auch versucht, die HTTP2 und folgenRedirects, andere URLs wie Google usw. zu entfernen, aber es hat nichts geändert. Was mache ich falsch?

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

Wenn es relevant ist, ist dies die Version ich verwende (neueste Version von 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

genommen haben hast du das jemals gelöst? – Jay

+0

@Jay: Bisher habe ich nicht. – user140547

+0

Hallo. Ich habe etwas Seltsames vor mir. Das Modul java.httpclient existiert im letzten JDK 9 überhaupt nicht (Build 9-ea + 159) –

Antwort

2

Verfahren sendAsyncMulti Verwendung eines HTTP2-Feature mit dem Namen Server-Push macht.

Die meisten http2-Clients, d. H. Moderne Browser und auch die Implementierung in jdk9, verwenden die neuen Funktionen nur, wenn der Host über https kontaktiert wird.

Die meisten http2-Server senden Push-Versprechungen nur, wenn die erste Client-Anforderung eine http2-Anforderung war.

Der folgende Ausschnitt arbeitet mit 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(); 

Das vollständige Arbeitsbeispiel kann bei Github zu finden: https://github.com/janweinschenker/jdk9-jigsaw-http2

Der Ausschnitt aus https://github.com/janweinschenker/jdk9-jigsaw-http2/blob/master/src/main/java/de/holisticon/jdk9showcase/http2client/ResponseAsyncMultiExample.java