adi*_*dis 11 rest playframework-2.0
是否有一种好的或正确的方法来根据参数在Play Framework中呈现输出?例:
对于HTML:
http://localhost:9000/user/get/5?v=HTML // should render HTML template
Run Code Online (Sandbox Code Playgroud)
对于JSON:
http://localhost:9000/user/get/5?v=JSON // should render JSON template
Run Code Online (Sandbox Code Playgroud)
我认为请求拦截器可以实现这一点,但我不知道如何开始或从哪里开始:-(
或者,也许,写一个render method读取参数和输出请求的将军,但这在我看来像是矫枉过正?
Jul*_*Foy 20
如果/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();
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,"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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9719 次 |
| 最近记录: |