jjzjj

java - 如何为初学者提供 : Accessing RESTful Web Services with Play Framework 2. 1

coder 2024-03-27 原文

我对这个问题中使用的许多概念和技术还很陌生,所以我希望能为社区的初学者提供一些理解和帮助。我正在使用 Play Framework 2.1.3 版,我需要将数据发布到 RESTful Web 服务,以便它可以插入到远程数据库中。将返回一个 XML 响应,指示成功或失败。

我相信您知道 Play Framework 的文档非常缺乏并且对初学者毫无帮助,因此我不确定如何在考虑最佳实践的情况下完成这项任务。我正在寻找这个问题的 Java 解决方案,我目前没有时间学习 Scala 语言。我在 Web 服务方面的经验相当有限,通常我会在我的应用程序中实现 DAO 设计模式(或根据需要使用许多可用的 ORM 库之一)并使用 JDBC 直接连接到数据库。这不是一个选项。

我的第一个问题是,是否有推荐的访问 Web 服务的设计模式?那么,考虑到 Play MVC 框架,如何最好地实现这样一种设计模式、打包数据(假设应用程序已经捕获并验证了来自用户的数据)、发送数据并处理返回给用户的响应?

我知道这是一个相当冗长的问题,但我这样做的目的是为初学者创建一个知识库,他们可以轻松地在经验有限的情况下进入,阅读、理解和复制他们在这里找到的内容以产生一个可行的解决方案。在广泛搜索网络后,我发现了一些不连贯的片段,但没有涉及这些技术的具体内容,也没有最新的教程。感谢您的宝贵时间。

最佳答案

创建请求非常简单。首先,您提供一个 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 的 Controller 给用户,基于网络服务的响应。结果通常是呈现的模板或可能只是状态代码。

Play 通过使用 Futures and Promises 避免阻塞. Controller 的 async方法需要一个 Promise<Result>并在稍后的某个时间返回结果( future 值)。 get 提供了一个简单易用的 promise 。和 post上面显示的方法。你不需要关心他们的实现,你只需要知道他们 promise 提供一个 Response一旦请求完成。

注意这里的问题:使用 WS.url("...").get() 创建请求时它会给你一个 Promise<Response>尽管 async需要 Promise<Result> .在这里你必须自己实现另一个 promise ,它将使用 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可能如下所示。它实际上就像是某种需要 Response 的回调方法的繁琐定义。作为唯一的参数并返回 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 在评论中指出的那样,当 calling webservices in Play 2.2.x你不把电话包装在 async 中任何更多。您只需返回 Promise<Result> :

public static Promise<Result> index() {
    return request.get().map(resultFromResponse);
}

关于java - 如何为初学者提供 : Accessing RESTful Web Services with Play Framework 2. 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18557818/

有关java - 如何为初学者提供 : Accessing RESTful Web Services with Play Framework 2. 1的更多相关文章

随机推荐