2016-06-01 79 views
2

過程階躍響應我打電話一些REST API和處理JSON響應,讀正式播放文檔,我試試這個:播放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的承諾。因此,您將獲得CompletableFuture(這是CompletionStage的實施)的toString簽名。

要處理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