播放WS API制作嵌套请求 - WSClient

时间:2016-03-16 07:00:19

标签: rest playframework playframework-2.0

我想使用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. *)

1 个答案:

答案 0 :(得分:2)

Java 8类型的推理错误在最好的时候都很糟糕。由于您传递给第一个map的lambda的结果为Promise<Result>,因此您尝试分配给myPromise的内容为Promise<Promise<Result>>。您实际想要做的是将map调用替换为flatMap,其名称是因为&#34;变平&#34;嵌套的承诺只是一个单一的承诺。