118

我们正在计划一个主要为移动应用程序提供内容的项目,但需要有一个网站。

我的问题是使用 Jersey 或 Restlet 为我们的移动应用程序开发 REST API,然后使用 Play!为网站服务。

还是只使用 Play 更有意义!做这一切?如果是这样,如何使用 Play 进行 REST!框架?

4

6 回答 6

113

根据请求,一种简单的类似 REST 的方法。它的工作方式与 Codemwncis 的解决方案几乎相同,但使用 Accept 标头进行内容协商。首先是路由文件:

GET     /user/{id}            Application.user
POST    /user/                Application.createUser
PUT     /user/{id}            Application.updateUser
DELETE  /user/{id}            Application.deleteUser

您没有在此处指定任何内容类型。恕我直言,只有当您想要为某些资源拥有“特殊”URI 时才需要这样做。就像在 Atom/RSS 中声明一个/users/feed/总是返回的路由。

应用程序控制器如下所示:

public static void createUser(User newUser) {
    newUser.save();
    user(newUser.id);
}

public static void updateUser(Long id, User user) {
    User dbUser = User.findById(id);
    dbUser.updateDetails(user); // some model logic you would write to do a safe merge
    dbUser.save();
    user(id);
}

public static void deleteUser(Long id) {
    User.findById(id).delete();
    renderText("success");
}

public static void user(Long id)  {
    User user = User.findById(id)
    render(user);
}

如您所见,我只删除了 getUserJSON 方法并重命名了 getUser 方法。要使不同的内容类型起作用,您现在必须创建多个模板。每个所需的内容类型一个。例如:

用户.xml:

<users>
  <user>
    <name>${user.name}</name>
    . . .
  </user>
</users>

用户.json:

{
  "name": "${user.name}",
  "id": "${user.id}",
  . . . 
}

用户.html:

<html>...</html>

这种方法始终为浏览器提供 HTML 视图,因为所有浏览器都在其 Accept 标头中发送 text/html 内容类型。所有其他客户端(可能是一些基于 JavaScript 的 AJAX 请求)可以定义自己想要的内容类型。使用 jQuerys ajax() 方法,您可以执行以下操作:

$.ajax({
  url: @{Application.user(1)},
  dataType: json,
  success: function(data) {
    . . . 
  }
});

这应该让您以 JSON 格式获取 ID 为 1 的用户的详细信息。Play 目前原生支持 HTML、JSON 和 XML,但您可以通过遵循官方文档或使用内容协商模块轻松使用不同的类型。

如果您使用 Eclipse 进行开发,我建议使用REST 客户端插件,它可以让您测试您的路线及其相应的内容类型。

于 2010-12-13T18:30:09.033 回答
68

这仍然是一个热门问题,但投票最高的答案与当前版本的游戏不同步。这是 play 2.2.1 的工作 REST 示例:

配置/路由:

GET     /users                 controllers.UserController.getUsers
GET     /users/:id             controllers.UserController.getUser(id: Long)
POST    /users                 controllers.UserController.createUser
PUT     /users/:id             controllers.UserController.updateUser(id: Long)
DELETE  /users/:id             controllers.UserController.deleteUser(id: Long)

应用程序/控制器/UserController.java:

public static Result getUsers()
{
    List<User> users = Database.getUsers();
    return ok(Json.toJson(users));
}

public static Result getUser(Long id)
{
    User user = Database.getUser(id);
    return user == null ? notFound() : ok(Json.toJson(user));
}

public static Result createUser()
{
    User newUser = Json.fromJson(request().body().asJson(), User.class);
    User inserted = Database.addUser(newUser);
    return created(Json.toJson(inserted));
}

public static Result updateUser(Long id)
{
    User user = Json.fromJson(request().body().asJson(), User.class);
    User updated = Database.updateUser(id, user);
    return ok(Json.toJson(updated));
}

public static Result deleteUser(Long id)
{
    Database.deleteUser(id);
    return noContent(); // http://stackoverflow.com/a/2342589/1415732
}
于 2013-11-13T15:01:02.627 回答
26

使用播放!做这一切。在 Play 中编写 REST 服务非常容易。

首先,路由文件使编写符合 REST 方法的路由变得简单。

然后,在控制器中为要创建的每个 API 方法编写操作。

根据您想要返回结果的方式(XML、JSON 等),您可以使用一些方法。例如,使用 renderJSON 方法,可以很容易地呈现结果。如果您想呈现 XML,那么您可以像在 View 中构建 HTML 文档一样执行此操作。

这是一个简洁的例子。

路线文件

GET     /user/{id}            Application.getUser(format:'xml')
GET     /user/{id}/json       Application.getUserJSON
POST    /user/                Application.createUser
PUT     /user/{id}            Application.updateUser
DELETE  /user/{id}            Application.deleteUser

申请文件

public static void createUser(User newUser) {
    newUser.save();
    renderText("success");
}

public static void updateUser(Long id, User user) {
    User dbUser = User.findById(id);
    dbUser.updateDetails(user); // some model logic you would write to do a safe merge
    dbUser.save();
    renderText("success");
}

public static void deleteUser(Long id) {
    // first check authority
    User.findById(id).delete();
    renderText("success");
}

public static void getUser(Long id)  {
    User user = User.findById(id)
    renderJSON(user);
}

public static void getUserJSON(Long id) {
    User user = User.findById(id)
    renderJSON(user);
}

获取用户.xml 文件

<user>
   <name>${user.name}</name>
   <dob>${user.dob}</dob>
   .... etc etc
</user>
于 2010-12-07T20:44:47.947 回答
5

与 JAX-RS 实现集成是使用 Play 的内置 HTTP 路由的一种可能的替代方法。有关 RESTEasy 示例,请参阅RESTEasy Play!模块

如果您已经投资于 JAX-RS,或者如果您需要 JAX-RS 提供的一些高级功能 REST(例如内容协商),那么这种方法是有意义的。如果没有,直接使用 Play 来提供 JSON 或 XML 以响应 HTTP 请求会更简单。

于 2010-12-09T21:17:53.650 回答
4

你应该看看

http://www.lunatech-labs.com/open-source/resteasy-crud-play-module

它是一个自动构建休息界面的游戏模块,就像 crud 模块自动构建管理区域一样......

于 2011-02-17T04:36:28.523 回答
2

看起来这种方法在 Play 1.2.3 版中被打破了。如果您下载由 @seb 完成并在前面提到的https://github.com/sebhoss/play-user-sample的源代码,则无法再使用带有 JSON 对象的 POST 创建新的用户对象。

您需要使用 json 和 xml POST 完成特定的创建方法。此处概述:https ://groups.google.com/forum/#!topic/play-framework/huwtC3YZDlU

于 2011-11-22T09:29:04.480 回答