繁体   English   中英

如何使用Play Framework 2.2(Java)进行同步WS调用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM