渲染取决于参数输出格式(HTML,JSON,XML)?(Render output format (

2019-06-24 15:14发布

有没有渲染取决于参数播放框架输出还是有道? 例:

对于HTML:

http://localhost:9000/user/get/5?v=HTML // should render HTML template

对于JSON:

http://localhost:9000/user/get/5?v=JSON // should render JSON template

我认为,一个请求拦截器可以有实现这一目标的能力,但我不知道如何开始或从哪里开始:-(

或许,写一般的render method来读取参数和输出的要求,但是这在我看来有点小题大做?

Answer 1:

如果/user/5?v=html/user/5?v=json返回相同资源的两种表示,他们应该是相同的URL,例如, /user/5 ,根据REST原则 。

在客户端,您可以使用Accept你的请求头,表示希望服务器送你哪个表示。

在服务器端,你可以写与播放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();
  }
}


Answer 2:

写2种方法,使用2条路线(因为你没有指定我会用Java范例:

public static Result userAsHtml(Long id) {
    return ok(someView.render(User.find.byId(id)));
}

public  static Result userAsJson(Long id) {
    return play.libs.Json.toJson(User.find.byId(id));
}

路线:

/GET    /user/get/:id/html     controllers.YourController.userAsHtml(id:Long)
/GET    /user/get/:id/json     controllers.YourController.userAsJson(id:Long)

接下来你可以让其他视图中显示用户的数据链接

<a href="@routes.YourController.userAsHtml(user.id)">Show details</a>
<a href="@routes.YourController.userAsJson(user.id)">Get JSON</a>

或者是其他东西...

编辑#1

你也可以使用常见的ifcase来确定最终的输出

public static Result userAsV() {
    String vType = form().bindFromRequest().get("v");

    if (vTtype.equals("HTML")){
        return ok(someView.render(User.find.byId(id)));
    }

    return play.libs.Json.toJson(User.find.byId(id));
}


Answer 3:

我希望用户能够在浏览器中查看HTML或为JSON所以接受的方法并没有为我工作。

我解决它通过把一个普通的renderMethod在基类与下面的样式语法

public static Result requestType( )
{
    if( request().uri().indexOf("json") != -1)
    {
        return ok(Json.toJson(request()));
    }
    else 
    {
        return ok("Got HTML request " + request() );
    }
}


文章来源: Render output format (HTML, JSON, XML) depending on parameter?