RESTful on Play!骨架

Gar*_*ary 117 java rest jersey restlet playframework

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

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

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

seb*_*seb 112

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

GET     /user/{id}            Application.user
POST    /user/                Application.createUser
PUT     /user/{id}            Application.updateUser
DELETE  /user/{id}            Application.deleteUser
Run Code Online (Sandbox Code Playgroud)

您没有在此处指定任何内容类型.只有当你想为某些资源拥有"特殊"URI时,才需要这样做.就像声明一条/users/feed/始终返回Atom/RSS 的路线一样.

Application控制器如下所示:

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);
}
Run Code Online (Sandbox Code Playgroud)

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

user.xml:

<users>
  <user>
    <name>${user.name}</name>
    . . .
  </user>
</users>
Run Code Online (Sandbox Code Playgroud)

user.json:

{
  "name": "${user.name}",
  "id": "${user.id}",
  . . . 
}
Run Code Online (Sandbox Code Playgroud)

user.html:

<html>...</html>
Run Code Online (Sandbox Code Playgroud)

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

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

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

如果您使用Eclipse进行开发,我建议使用REST客户端插件,它允许您测试路由及其相应的内容类型.

  • 感谢发布此内容.表演!docs是我在解释事物的基本结构时看到的最好的东西,但偶尔缺乏详细的例子.在同一个例子中展示的两种方法确实可以解决问题. (2认同)
  • @Gary:也许你使用"user"而不是"newUser"?控制器和表单参数的名称必须匹配.我创建了一个显示上述方法的简单项目,包括所有用户的HTML/XML/JSON输出,网址为https://github.com/sebhoss/play-user-sample (2认同)

Ald*_*den 68

这仍然是一个受欢迎的问题,但最高的投票答案与当前版本的游戏不同.这是一个使用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)
Run Code Online (Sandbox Code Playgroud)

应用程序/控制器/ 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
}
Run Code Online (Sandbox Code Playgroud)


Cod*_*nci 26

使用Play!做到这一切.在Play中编写REST服务非常容易.

首先,routes文件使编写符合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
Run Code Online (Sandbox Code Playgroud)

申请文件

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);
}
Run Code Online (Sandbox Code Playgroud)

getUser.xml文件

<user>
   <name>${user.name}</name>
   <dob>${user.dob}</dob>
   .... etc etc
</user>
Run Code Online (Sandbox Code Playgroud)

  • 我不认为在URI中明确指定表示类型更像REST.最好直接使用Accept标头,不要更改URI,因为您要查看的资源保持不变.上面的示例可以重写为只有一个getUser(Long id)方法,它与当前实现完全相同,但不是定义getUserJSON,getUserXML等,而是定义getUser.json和getUser.xml模板.虽然我也将其重命名为user.json/user.xml (29认同)

Pet*_*ton 5

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

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