2016-07-10 1 views
11

J'essaie d'expérimenter avec HttpClient de Java 9.Java 9 HttpClient avec sendAsyncMulti/multiResponseAsync

L'exemple de base comme dans HttpRequest's javadoc fonctionne sans problèmes:

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

Cependant, en essayant d'utiliser sendAsyncMulti, il ne fonctionne pas. Aucun fichier n'est créé dans E:\foo, le println après join n'est pas atteint, il n'y a également aucune exception, bien que j'ai fondamentalement copié l'exemple de HttpResponse.multiFile's Javadoc. Je m'attendais à ce que certaines réponses HTTP soient enregistrées dans ce répertoire. J'ai également essayé de supprimer le HTTP2 et followRedirects, d'autres URL comme google etc, mais cela n'a rien changé. Qu'est-ce que je fais mal?

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

Si elle est pertinente, c'est la version que je utilise (dernière version de 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

fait Tu as déjà résolu ça? – Jay

+0

@Jay: jusqu'à présent, je n'ai pas. – user140547

+0

Salut. Je fais face à quelque chose d'étrange. Le module java.httpclient n'existe pas du tout dans le dernier JDK 9 (build 9-ea + 159) –

Répondre

2

La méthode sendAsyncMulti utilise une poussée de serveur nommé HTTP2-fonctionnalité.

La plupart des clients http2, c'est-à-dire les navigateurs modernes et l'implémentation dans jdk9, n'utilisent les nouvelles fonctionnalités que si l'hôte est contacté via https.

La plupart des serveurs http2 n'envoient des promesses push que si la requête initiale du client était une requête http2.

L'extrait suivant fonctionne avec 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(); 

L'exemple de travail complet se trouve à github: https://github.com/janweinschenker/jdk9-jigsaw-http2

L'extrait est tiré de https://github.com/janweinschenker/jdk9-jigsaw-http2/blob/master/src/main/java/de/holisticon/jdk9showcase/http2client/ResponseAsyncMultiExample.java