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

标签 java playframework-2.0

我正在寻找类似 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/

相关文章:

java - 如何从 YAML 文件加载 DATETIME 对象?

java - 尝试在 Ubuntu 上编译/运行 Java 代码,错误 : java. lang.NoClassDefFoundError: org/apache/pdfbox/pdmodel/PDDocument

java - 在java中为storm使用单独的Log4j

java - 如何降低if中多个条件的圈复杂度?

lambda - 使用CompletionStage返回结果

java - 在 Java Play 中解析 JSON

java - 发送邮件并插入数据库 Play Framework

java - 我如何从 URL 下载并保存设备存储 "Pdf file"单击 RecyclerView?

java - 阅读 GSON 以获取顶级标签列表

git - Play 2.2+项目中的build.sbt可以依赖于GitHub项目SBT吗?