如果/user/5?v=html
和/user/5?v=json
返回相同资源的两个表示,它们应该是相同的 URL,例如/user/5
,根据REST 原则。
在客户端,您可以使用Accept
请求中的标头来指示您希望服务器向您发送哪种表示形式。
在服务器端,您可以使用 Play 2.1 编写以下代码来测试Accept
标头的值:
public static Result user(Long id) {
User user = User.find.byId(id);
if (user == null) {
return notFound();
}
if (request().accepts("text/html")) {
return ok(views.html.user(user));
} else if (request().accepts("application/json")) {
return ok(Json.toJson(user));
} else {
return badRequest();
}
}
请注意,测试"text/html"
应始终在任何其他内容类型之前编写,因为浏览器将Accept
其请求的标头设置为*/*
匹配所有类型。
如果您不想if (request().accepts(…))
在每个操作中编写,您可以将其分解出来,例如如下:
public static Result user(Long id) {
User user = User.find.byId(id);
return representation(user, views.html.user.ref);
}
public static Result users() {
List<User> users = User.find.all();
return representation(users, views.html.users.ref);
}
private <T> Result representation(T resource, Template1<T, Html> html) {
if (resource == null) {
return notFound();
}
if (request().accepts("text/html")) {
return ok(html.apply(resource));
} else if (request().accepts("application/json")) {
return ok(Json.toJson(resource));
} else {
return badRequest();
}
}