玩RESTful! 骨架

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

我的问题是使用Jersey或Restlet为我们的移动应用开发REST API是否有意义,然后使用Play! 为该网站提供服务。

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


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

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

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

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

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方法。 对于不同的内容类型,您现在必须创建多个模板。 每个需要的内容类型一个。 例如:

user.xml:

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

user.json:

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

user.html:

<html>...</html>

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

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

哪个应该为您提供关于具有JSON格式的ID 1的用户的详细信息。 Play当前支持HTML,JSON和XML,但您可以通过正式文档或使用内容协商模块轻松使用其他类型。

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


这仍然是一个受欢迎的问题,但最高票数的答案与当前版本的比赛没有更新。 以下是Play 2.2.1中的一个可用的REST示例:

CONF /路线:

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
}

使用Play! 做到这一切。 在Play中编写REST服务非常简单。

首先,路由文件使得直接编写符合REST方法的路由成为可能。

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

根据您希望返回结果(XML,JSON等)的方式,您可以使用几种方法。 例如,使用renderJSON方法,可以使结果非常容易地呈现。 如果您想渲染XML,那么您可以像在视图中构建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);
}

getUser.xml文件

<user>
   <name>${user.name}</name>
   <dob>${user.dob}</dob>
   .... etc etc
</user>
链接地址: http://www.djcxy.com/p/64445.html

上一篇: RESTful on Play! framework

下一篇: How to bundle a third party library in a Play Framework module?