我们正在计划一个主要为移动应用提供内容的项目,但需要有一个网站。
我的问题是使用 Jersey 或 ReSTLet 为我们的移动应用程序开发 REST API,然后使用 Play!为网站服务。
还是只使用 Play 更有意义!做这一切?如果是这样,如何使用 Play 进行 REST!框架?
最佳答案
根据要求,一种简单的类似 REST 的方法。它的工作方式与 Codemwncis 的解决方案几乎相同,但使用 Accept header 进行内容协商。首先是路由文件:
GET /user/{id} Application.user
POST /user/ Application.createUser
PUT /user/{id} Application.updateUser
DELETE /user/{id} Application.deleteUser
您没有在此处指定任何内容类型。恕我直言,只有当您想要为某些资源拥有“特殊”URI 时才需要这样做。就像声明到 /users/feed/
的路由总是在 Atom/RSS 中返回一样。
应用程序 Controller 如下所示:
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>
这种方法始终为浏览器提供 HTML View ,因为所有浏览器都在其 Accept header 中发送 text/html 内容类型。所有其他客户端(可能是一些基于 JavaScript 的 AJAX 请求)可以定义自己想要的内容类型。使用 jQuerys ajax() 方法,您可以执行以下操作:
$.ajax({
url: @{Application.user(1)},
dataType: json,
success: function(data) {
. . .
}
});
这应该可以让您以 JSON 格式获取 ID 为 1 的用户的详细信息。 Play 目前原生支持 HTML、JSON 和 XML,但您可以通过遵循 official documentation 轻松使用不同的类型。或使用 content negotiation module .
如果您使用 Eclipse 进行开发,我建议使用 REST client plugin它可以让您测试您的路线及其相应的内容类型。
关于java - RESTful 畅玩!框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4379485/