2016-06-01 5 views
2

Я пытаюсь вызвать некоторые REST API и обработать ответ в формате JSON, прочитав официальный Play док, я стараюсь это один:Play 2,5: Обрабатывать акустический отклик от API

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

Но когда я печатаю маркер с помощью System.out.println(token),

Я получил это сообщение [email protected][Not completed] вместо JSON.

Я все еще пытаюсь понять концепцию будущего и обещания, есть ли что-то, что я пропустил?

Заранее спасибо

ответ

2

Если вы нарушите это вниз, вы найдете следующее:

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

Обратите внимание на имя, которое я дал переменную: eventualResponse. То, что получено от .get(), не является ответом от HTTP-вызова, но обещает, что в конечном итоге будет один.

Принимая следующий шаг, мы имеем это:

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

Опять же, это обещание что когда eventualResponse является полной и response (параметр лямбда) доступен, метод asJson будет вызван на response , Это также происходит асинхронно.

Это означает, что то, что вы проходите до System.out.println, не является JSON, а скорее обещанием JSON. Соответственно, вы получаете подпись toStringCompletableFuture (которая представляет собой реализацию CompletionStage).

Для обработки JSON, держать цепь собирается:

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

NB Существует небольшая разница между обещанием и будущее - в этом ответе я использовал термины взаимозаменяемыми, но это стоит зная разницу. Взгляните на https://softwareengineering.stackexchange.com/a/207153 для краткого взятия этого.

+0

Спасибо! Для ответа и ссылки, эта статья в википедии действительно дает галочку. – Adakbar

Смежные вопросы