2016-06-01 3 views
2

ich versuchen, einige REST API aufrufen und die JSON-Antwort verarbeiten, die offizielle Wiedergabe doc lesen, ich versuche, dieses:Wiedergabe 2.5: Prozess respones von API

CompletionStage<JsonNode> token = ws.url("http://url.com") 
    .get() 
    .thenApply(response -> response.asJson()); 

Aber wenn ich das Token Drucken mit System.out.println(token),

Ich habe diese Nachricht [email protected][Not completed] anstelle von JSON erhalten.

Ich versuche immer noch, das Konzept von Zukunft und Versprechen zu verstehen, gibt es etwas, das ich verpasst habe?

Vielen Dank im Voraus

Antwort

2

Wenn Sie diese brechen, werden Sie folgendes finden:

CompletionStage<WSResponse> eventualResponse = ws.url("http://url.com").get() 

Beachten Sie den Namen gab ich die Variable: eventualResponse. Was von .get() erhalten wird, ist keine Antwort vom HTTP-Aufruf, sondern ein Versprechen, dass es irgendwann eins geben wird.

Der nächste Schritt, haben wir diese:

CompletionStage<JsonNode> eventualJson = eventualResponse.thenApply(response -> response.asJson()); 

Wieder ist es ein Versprechen, dass, wenn eventualResponse abgeschlossen ist und response (der Lambda-Parameter) zur Verfügung steht, die asJson Methode auf response aufgerufen wird . Dies geschieht auch asynchron.

Das bedeutet, dass das, was Sie an System.out.println übergeben, nicht das JSON, sondern das Versprechen von JSON ist. Dementsprechend erhalten Sie die toString Signatur eines CompletableFuture (die eine Implementierung von CompletionStage ist).

die JSON zu bearbeiten, um die Kette weitermachen:

ws.url("http://url.com") 
    .get() 
    .thenApply(response -> response.asJson()) 
    .thenApply(json -> do something with the JSON) 
    . and so on 

NB Es gibt einen kleinen Unterschied zwischen Versprechen und Zukunft - in dieser Antwort, die ich die Begriffe synonym verwendet haben, aber es lohnt sich den Unterschied kennen. Werfen Sie einen Blick auf https://softwareengineering.stackexchange.com/a/207153 für eine prägnante Aufnahme.

+0

Danke! Für die Antwort und die Referenz gibt dieser Wikipedia-Artikel wirklich die Zecke. – Adakbar