我想使用play2 WSRequest发出两个HTTP请求(POST),其中第一个响应的一些信息被发送到第二个请求。我尝试以下列方式执行此操作,以确保第二个请求仅在第一个请求完成后触发。但我得到类型不匹配:无法从F.Promise转换为F.Promise 错误
public Promise<Result> executeAPI(String apiName,JsonNode requestBody){
WSRequest pcLoginRequest = ws.url("http://xxxxx.qa.local:8080/mytest/rest/login");
pcLoginRequest.setContentType("application/json");
pcLoginRequest.setHeader("X-x-Password", "xxxxx")
.setHeader("X-x-Username", "xxxxx")
.setHeader("X-x-Content-Type", "application/json");
Promise<Result> myPromise = pcLoginRequest.post("").map(response -> {
ProApiSession.getInstanceOf().setProToeken(response.asJson().get("token").asText());
WSRequest pcrequest = ws.url("http://xxxxx.qa.local:8080/mytest/rest/api/" + apiName);
pcrequest.setContentType("application/json");
pcrequest.setHeader("X-x-Token",ProApiSession.getInstanceOf().getProToeken() )
.setBody(requestBody)
.setHeader("X-x-Content-Type", "application/json");
Promise<Result> myPromise2 = pcLoginRequest.post(requestBody).map(response2 -> {
return Results.ok(response2.asJson());
});
return myPromise;
});
有人可以建议如何在播放中使用WSRequest来执行嵌套请求。 (import play.libs.ws. *)
答案 0 :(得分:2)
Java 8类型的推理错误在最好的时候都很糟糕。由于您传递给第一个map
的lambda的结果为Promise<Result>
,因此您尝试分配给myPromise
的内容为Promise<Promise<Result>>
。您实际想要做的是将map
调用替换为flatMap
,其名称是因为&#34;变平&#34;嵌套的承诺只是一个单一的承诺。