2012-05-20 5 views
11

が良いか、パラメーターに応じてPlay Frameworkで出力をレンダリングする適切な方法ですか?例:HTMLの場合レンダリング出力形式(HTML、JSON、XML)はパラメータによって異なりますか?

:JSONのために

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

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

私はリクエストインターセプタは、これを達成する能力を持っている可能性があることと思いますが、私はどのように見当もつかない開始する場所または開始する場所:-(

またはおそらく、一般的なrender method要求通りにパラメータと出力を読み込みますが、これは私には過剰殺人のようですか?

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) 

あなただけの他のビュー内のリンクを作ることができますが、私はJavaのサンプルを使用する指定していないよう

答えて

20

/user/5?v=htmlの場合と/user/5?v=jsonリターン2つの表現を決定するために、共通のifcaseを使用することができ、それらは同じURLである必要があり、例えばREST principlesに従い、/user/5である。

クライアント側では、要求に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ヘッダの値をテストするためにプレイ2.1で次のように記述することができます要求のAcceptヘッダーをすべての種類に一致する*/*に設定します。

各アクションにif (request().accepts(…))を書きたくない場合は、それを除外することができます。

+0

よろしくお願いします。しかし、HTMLフォームやJSONオブジェクト(リクエストから)に基づいてJavaオブジェクトにバインドする方法は、if/elseステートメントで実装する必要がありますか?または、 'bindFromRequest'が両方を提供しますか? – adis

+0

'bindFromRequest'は、クエリ文字列とリクエスト本体(JSON、URL形式のエンコードなど)を使用します。 –

2

書き込みの2つの方法、(2つのルートを使用ユーザーのデータを表示するには

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

または何か他のもの...

編集#1

あなたはまた、最終的な出力と同じリソースの

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)); 
} 
+0

これは仕事ができると、基底クラスにジェネリックrenderMethodを入れますが、複製して、それを解決しました。私はこれを直接使用するケースはありませんが、将来私はネイティブのモバイルアプリケーションを作成したいと思っています。私はJSONを取得するためにreqeustを作成したいと思います... – adis

+0

あなたが望むように、** edit#1 * * – biesior

0

ユーザーがブラウザでhtmlまたはjsonとして表示できるようにしたいので、acceptsメソッドがうまくいかないようにしました。

は、私は私の最初の選択肢ではないでしょうものを、次の形式の構文

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