2016-08-16 69 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); 
      }); 
    }