我在java 8中使用play2.5。我正在使用
向服务器发出POST请求WSRequest request = ws.url("http://abababa .com");
WSRequest complexRequest = request.setHeader("X-API-Key", "xxxxxx")
.setHeader("Content-Type", "application/x-www-form-urlencoded")
CompletionStage<WSResponse> responsePromise = complexRequest.post("grant_type=password"
+ "&username=xxxxx&password=yyyyy");
CompletionStage<JsonNode> jsonPromise = responsePromise.thenApply(WSResponse::asJson);
如何打印响应的最终响应。我想返回部分响应此函数。与同步代码相比,调用此函数的函数是否也有不同的代码?
答案 0 :(得分:11)
jsonPromise.toCompletableFuture().get()
答案 1 :(得分:2)
问题是所有这些代码都是异步执行的。如果你确实想从结果中返回结果,则必须先阻塞,直到得到结果。阻塞效果不佳,因为它会影响性能。通常,您希望按原样返回CompletionStage,并让调用者决定如何处理它。但是,如果您必须绝对返回结果,则示例代码如下所示。
WSRequest request = ws.url("http://abababa .com");
WSRequest complexRequest = request.setHeader("X-API-Key", "xxxxxx")
.setHeader("Content-Type", "application/x-www-form-urlencoded")
CompletionStage<WSResponse> responsePromise = complexRequest.post("grant_type=password"
+ "&username=xxxxx&password=yyyyy");
CompletionStage<JsonNode> jsonPromise = responsePromise.thenApply(WSResponse::asJson);
Object waitGuard = new Object();
AtomicReference<JsonNode> resultReference = new AtomicReference();
synchronized(waitGuard){
jsonPromise.thenAccept( jsonNode -> {
resultReference.set(jsonNode);
waitGuard.notify();
});
waitGuard.wait();
}
return resultReference.get();
答案 2 :(得分:1)
JsonNode jsonData = jsonPromise.toCompletableFuture().get()
我尝试了上面的代码但是我得到编译器错误,返回JsonNode数据,然后我用
JsonNode jsonData = jsonPromise.toCompletableFuture().join()
并且工作正常