我尝试调用一些REST API并处理JSON响应,阅读官方Play文档,我试试这个:
CompletionStage<JsonNode> token = ws.url("http://url.com")
.get()
.thenApply(response -> response.asJson());
但是当我使用System.out.println(token)
打印令牌时,
我收到此消息java.util.concurrent.CompletableFuture@4a5ece42[Not completed]
而不是JSON。
我仍在努力理解未来和承诺的概念,我有什么遗漏吗?
提前致谢
答案 0 :(得分:2)
如果你打破了这一点,你会发现以下内容:
CompletionStage<WSResponse> eventualResponse = ws.url("http://url.com").get()
注意我给变量的名称:eventualResponse
。从.get()
获得的不是HTTP调用的回复,而是 promise 最终会有一个回复。
采取下一步,我们有:
CompletionStage<JsonNode> eventualJson = eventualResponse.thenApply(response -> response.asJson());
同样,它是承诺,当eventualResponse
完成且response
(lambda参数)可用时,asJson
方法将是在response
上调用。这也是异步发生的。
这意味着您传递给System.out.println
的不是JSON,而是JSON的承诺。因此,您获得了toString
的{{1}}签名(这是CompletableFuture
的实现)。
要处理JSON,请保持链接:
CompletionStage
NB 承诺与未来之间存在细微差别 - 在这个答案中,我已经可以互换使用这些术语,但是值得了解其中的差异。请查看https://softwareengineering.stackexchange.com/a/207153以便对此进行简洁的介绍。