2016-03-16 28 views
0

我想使用play2 WSRequest發出兩個HTTP請求(POST),其中來自第一個響應的一些信息被髮送到第二個請求。我試圖按照以下方式做到這一點,以確保第二次請求僅在第一次請求完成後才觸發。但我得到類型不匹配:不能從F.Promise轉換爲F.Promise錯誤播放WS API製作嵌套請求 - WSClient

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. *)

回答

2

Java 8類型推斷錯誤在最好的時候是不好的。由於您傳遞給第一個map的lambda的結果爲Promise<Result>,因此您要分配給myPromise的是Promise<Promise<Result>>。你實際上想要做的就是用flatMap替換掉map,這個名字的命名是因爲它將嵌套承諾「扁平化」成爲一個單一的承諾。