创建请求很简单。首先,您提供一个 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);
复杂的部分是发送它并使用请求的响应。我假设您有一个控制器,它应该Result
根据 Web 服务的响应向用户返回一个。结果通常是一个渲染的模板,或者可能只是一个状态码。
Play 通过使用Futures 和 Promises避免阻塞。控制器的async
方法接受 aPromise<Result>
并在稍后的某个时间返回结果(未来值)。get
上面显示的和post
方法提供了一个简单易用的 Promise 。您不需要关心他们的实现,您只需要知道他们承诺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
可能如下所示。它实际上就像是某种回调方法的繁琐定义,它接受 aResponse
作为唯一参数并返回 a 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 在评论中指出的那样,在 Play 2.2.x 中调用 web服务时,您不再包含调用async
。您只需返回Promise<Result>
:
public static Promise<Result> index() {
return request.get().map(resultFromResponse);
}