2016-08-16 71 views
2

我使用可以玩Java为我的项目(Java游戏WS API)和来作出嵌套的http请求的Java异步

private CompletionStage<String> getAuthToken() { 
    WSRequest request = ws.url(URL); 
    WSRequest complexRequest = request.setHeader("X-API-Key", X_API_KEY) 
      .setHeader(CONTENT_TYPE, CONTENT_TYPE_VALUE) 
      .setHeader(AUTHORIZATION, CLIENT_DETAILS_BASE64_ENCODE); 
    CompletionStage<WSResponse> responsePromise = complexRequest.post(GRANT_TYPE + "=" 
      + PASSWORD + "&" + USERNAME + "=" + USERNAME + "&" + PASSWORD + "=" + PASSWORD); 
    return responsePromise.thenApply(response-> getAuthToken2().toString()); 
} 

private CompletionStage<String> getAuthToken2() { 
    WSRequest request = ws.url(URL); 
    WSRequest complexRequest = request.setHeader("X-API-Key", X_API_KEY) 
      .setHeader(CONTENT_TYPE, CONTENT_TYPE_VALUE) 
      .setHeader(AUTHORIZATION, CLIENT_DETAILS_BASE64_ENCODE); 
    CompletionStage<WSResponse> responsePromise = complexRequest.post(GRANT_TYPE + "=" 
      + PASSWORD + "&" + USERNAME + "=" + USERNAME + "&" + PASSWORD + "=" + PASSWORD); 
    return responsePromise.thenApply(response-> addIdentity(response.asJson().findValue("access_token").toString()).toString()); 
} 

什么是错误的,我在做什么?我如何一个接一个地嵌套请求?

我得到

[email protected][Not completed] 

为回应我的客户

回答

2

你必须使用thenCompose把多个HTTP请求。这里是一个工作示例:对于三个站点,我们将获取他们的页面并将状态代码添加到JSON对象。最后,我们返回该对象。

public CompletionStage<Result> getSites() { 
    ObjectNode hosts = Json.newObject(); 
    return ws.url("https://www.facebook.com").get() 
      .thenCompose(res -> { 
       hosts.put("facebook", res.getStatus()); 
       return ws.url("https://www.google.com").get(); 
      }) 
      .thenCompose(res -> { 
       hosts.put("google", res.getStatus()); 
       return ws.url("https://www.twitter.com").get(); 
      }) 
      .thenApply(res -> { 
       hosts.put("twitter", res.getStatus()); 
       return ok(hosts); 
      }); 
    }