11

パラメータに応じて Play Framework で出力をレンダリングする適切な方法はありますか? 例:

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、パラメーターを読み取って要求どおりに出力するジェネラルを作成することもできますが、これはやり過ぎのように思えます。

4

3 に答える 3

20

/user/5?v=htmlとが同じリソースの 2 つの表現を返す場合/user/5?v=json、それらは同じ URL である必要があります (たとえば/user/5REST の原則に従って) 。

クライアント側ではAccept、リクエストでヘッダーを使用して、サーバーが送信する表現を示すことができます。

Acceptサーバー側では、ヘッダーの値をテストするために Play 2.1 で次のように記述できます。

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();
  }
}
于 2012-05-21T13:04:56.023 に答える
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

commonifまたはcaseを使用して最終出力を決定することもできます

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));
}
于 2012-05-20T20:26:59.390 に答える
0

ユーザーをブラウザーで html または json として表示できるようにしたかったため、accepts メソッドは機能しませんでした。

次のスタイル構文を使用して、基本クラスにジェネリック renderMethod を配置することで解決しました

public static Result requestType( )
{
    if( request().uri().indexOf("json") != -1)
    {
        return ok(Json.toJson(request()));
    }
    else 
    {
        return ok("Got HTML request " + request() );
    }
}
于 2012-08-10T06:17:59.533 に答える