按照要求,一个简单的类似REST的方法。它几乎与CodeMwnci解决方案的工作方式相同,但使用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);
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视图,因为所有浏览器都在其接受标头中发送text/html内容类型。所有其他客户端(可能是一些基于JavaScript的AJAX请求)都可以定义自己所需的内容类型。使用jQuery的ajax()方法,您可以执行以下操作:
```
该方法始终为浏览器提供HTML视图,因为所有浏览器都在其接受标头中发送text/html内容类型。所有其他客户端(可能是一些基于JavaScript的AJAX请求)都可以定义自己所需的内容类型。使用jQuery的ajax()方法,您可以执行以下操作:
```
$.ajax({
url: @{Application.user(1)},
dataType: json,
success: function(data) {
. . .
}
});
这将以JSON格式提供ID为1的用户详细信息。Play目前本地支持HTML、JSON和XML,但您可以通过遵循官方文档或使用内容协商模块轻松使用其他类型。
如果您正在使用Eclipse进行开发,我建议使用REST客户端插件,该插件可让您测试路由及其相应的内容类型。