根据参数渲染输出格式(HTML,JSON,XML)?

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)