創建請求很簡單。首先你提供一個URL。有多種方法可將內容類型,查詢參數,超時等添加到請求中。然後你選擇一個請求類型,並可選擇添加一些內容發送。實例:
WSRequestHolder request = WS.url("http://example.com");
request.setQueryParameter("page", "1");
Promise<Response> promise = request.get();
Promise<Response> promise = WS.url("http://example.com").post(content);
的複雜的部分是發送它,並使用請求的響應。我假設你有一個控制器應該根據Web服務的響應返回一個Result
給用戶。結果通常是一個渲染模板或者只是一個狀態碼。
播放通過使用Futures and Promises避免阻止。控制器的async
方法採用Promise<Result>
,並在稍後的某個點返回結果(未來值)。上面顯示的get
和post
方法提供了一個簡單易用的承諾。你不需要關心他們的實現,你只需要知道他們承諾一旦請求完成就提供一個Response
。
注意這裏的問題:當創建與WS.url("...").get()
的請求,它會給你一個Promise<Response>
即使async
需要Promise<Result>
。在這裏,您必須自己實現另一個承諾,該承諾將使用map
方法將響應轉換爲結果。如果你遵循Play文檔,這看起來有點混亂,因爲Java沒有關閉(但是),並且所有東西都必須包裝在一個類中。不過,您不必在方法調用中使用匿名類。如果你喜歡更簡潔的代碼,你也可以做這樣的:
return async(
request
.get() // returns a `Promise<Response>`
.map(resultFromResponse) // map takes a `Function<Response, Result>` and
// returns the `Promise<Result>` we need
);
對象resultFromResponse
可能看起來像如下。它實際上就像某種回調方法的繁瑣定義,它只需要Response
作爲參數並返回Result
。
Function<Response, List<T>> resultFromResponse =
new Function<Response /* 1st parameter type */, Result /* return type */>() {
@Override
public Result apply(Response response) {
// example: read some json from the response
String message = response.asJson().get("message");
Result result = ok(message);
return result;
}
};
由於@itsjeyd的意見,當你calling webservices in Play 2.2.x不裹在async
調用更多的指出。您只需返回Promise<Result>
:
public static Promise<Result> index() {
return request.get().map(resultFromResponse);
}
這個職位是非常相似的,雖然不是直線上升複製我相信:http://stackoverflow.com/questions/4379485/restful-on-play-framework - 與此相結合表演!待辦事項列表的例子,這應該給你一個堅實的起點。 – pfairbairn
感謝您的迴應,因爲問題在2010年被問到,我認爲它是指玩遊戲框架版本1,因爲遊戲2僅在2012年發佈。它們絕不相同。然而,我可能是錯的,並且會複查帖子。我更關注這裏的最佳實踐。 – Hegemon
公平點,但是交叉引用該帖子與Java Play 2.1待辦事項列表,http://www.playframework.com/documentation/2.1.x/JavaTodoList,有關路由的信息,使用POST,GET和PUT進行HTTP請求會使該SO帖子看起來很有用,即使它有點過時。 – pfairbairn