RESTful在播放! 骨架

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

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

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

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

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

您不在此处指定任何内容types。 这样做是恕我直言,只有当你想拥有“特殊”的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方法。 对于不同的内容types,你现在必须创build几个模板。 一个用于每个所需的内容types。 例如:

user.xml:

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

user.json:

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

user.html:

 <html>...</html> 

这种方法使得浏览器总是HTML视图,因为所有浏览器都在Accept头中发送文本/ html内容types。 所有其他客户端(可能是一些基于JavaScript的AJAX请求)可以定义他们自己想要的内容types。 使用jQuerys ajax()方法你可以做到以下几点:

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

哪个应该给你带有JSON格式的ID 1的用户的详细信息。 Play当前支持HTML,JSON和XML,但您可以通过遵循正式文档或使用内容协商模块轻松使用不同的types。

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

这仍然是一个受欢迎的问题,但最高票数的答案还没有达到目前的版本。 这里有一个工作REST的例子与播放2.2.1:

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方法的路由成为可能。

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

根据你想返回结果(XML,JSON等)的方式,你可以使用一些方法。 例如,使用renderJSON方法,可以很容易地渲染结果。 如果你想呈现XML,那么你可以像在你的视图中build立一个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> 

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

如果您已经投资了JAX-RS,或者您需要JAX-RS提供的某些高级functionREST(如内容协商),则此方法是有意义的。 如果不是,则直接使用Play来提供JSON或XML来响应HTTP请求会更简单。

你应该看看

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

它是一个自动构buildrest界面的游戏模块,就像crud模块自动构buildpipe理区域一样…

在Play 1.2.3版本中,似乎这种方法已经被破坏了。 如果您下载由@seb完成的源代码并在前面提到https://github.com/sebhoss/play-user-sample ,那么使用带有JSON对象的POST创build新的用户对象将不再可能。

您需要使用json和xml POST来创build具体的创build方法。 这里概述: https ://groups.google.com/forum/#! topic/ play-framework/huwtC3YZDlU