![](/img/trans.png)
[英]Play Framework 2.2 (java) WS recovery block does not catch HTTP exception
[英]How to make a synchronous WS call with Play Framework 2.2 (Java)
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
文件中进行说明。
您可以做的就是阻止呼叫等待,直到您想得到超时响应为止。
WS.Response response = WS.url(url)
.setHeader("Authorization","BASIC base64str")
.setContentType("application/json")
.post(requestJsonNode)
.get(20000); //20 sec
JsonNode resNode = response.asJson();
在较新的play版本中,response不再具有asJson()
方法。 相反,必须将Jackson(或任何其他json映射器)应用于主体String:
final WSResponse r = ...;
Json.mapper().readValue(r, Type.class)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.