我正在寻找类似 this 的示例但通过同步调用。我的程序需要来自外部源的数据,并且应该等到响应返回(或直到超时)。
最佳答案
Play WS 库适用于异步请求,这很好!
使用它可以确保您的服务器不会被阻止并等待某些响应(您的客户端可能会被阻止,但这是一个不同的主题)。
只要有可能,您应该始终选择异步 WS 调用。请记住,您仍然可以访问 WS 调用的结果:
public static Promise<Result> index() {
final Promise<Result> resultPromise = WS.url(feedUrl).get().map(
new Function<WS.Response, Result>() {
public Result apply(WS.Response response) {
return ok("Feed title:" + response.asJson().findPath("title"));
}
}
);
return resultPromise;
}
您只需要稍微不同地处理它 - 您提供一个映射函数 - 基本上您是在告诉 Play 在结果到达时如何处理它。然后你继续前进,让 Play 处理剩下的事情。很好,不是吗?
现在,如果您真的非常想阻止,那么您将必须使用另一个库来发出同步请求。 Apache HTTP 客户端有一个同步变体 - https://hc.apache.org/httpcomponents-client-ga/index.html
我也喜欢 Unirest 库 ( http://unirest.io/java.html ),它实际上位于 Apache HTTP 客户端之上,并提供更好、更干净的 API - 然后您可以执行以下操作:
Unirest.post("http://httpbin.org/post")
.queryString("name", "Mark")
.field("last", "Polo")
.asJson()
由于两者都是公开可用的,因此您可以将它们作为项目的依赖项 - 通过在 build.sbt
文件中声明这一点。
关于java - 如何使用 Play Framework 2.2 (Java) 进行同步 WS 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36545751/