Play 2.5:流程响应API

时间:2016-06-01 04:55:51

标签: java playframework-2.5

我尝试调用一些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。

我仍在努力理解未来和承诺的概念,我有什么遗漏吗?

提前致谢

1 个答案:

答案 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以便对此进行简洁的介绍。