9

私は、新しい Play Framework 2 を使用してリクエスト パラメータを処理する方法について少し混乱していると言わざるを得ません。データは、リクエストの作成方法に関してさまざまな起源から取得されます。これまでのところ、可能性は次のとおりです。

1 - 単純な GET を実行する場合:

ctx().request().queryString()

2 - HTML フォームを使用して POST を実行する場合:

フォーム :

<form method="post" action="/">
    <input type="hidden" name="foo" value="bar" />
    <input type="hidden" name="t" value="1" />
    <input type="hidden" name="bool" value="true" />
    <input type="submit" name="submit" value="Submit" />
</form>

方法 :

public static Result test() {
    ctx().request().queryString();             // {} ; As expected
    ctx().request().body();                    // contains data
    ctx().request().body().asFormUrlEncoded(); // contains data
    ctx().request().body().asJson();           // empty
    return ok();
}

これは正常なようです。

ここで追加する@BodyParser.Of(BodyParser.Json.class)と (非 JS の場合のフォールバックに Ajax POST と通常の POST の両方を受け入れるとします):

@BodyParser.Of(BodyParser.Json.class)
public static Result test() {
    ctx().request().queryString();             // {} ; as Expected
    ctx().request().body();                    // contains data
    ctx().request().body().asFormUrlEncoded(); // empty : Shouldn't this contains data since I posted them via a simple form ?!
    ctx().request().body().asJson();           // empty
    return ok();
}

そして、地獄が起こりました:単純なフォームの値がどれも入力されていない場合(asJson、asFormUrlEncodedなど)、どうすれば取得できますか?!

3 - AJAX 経由で POST を実行する場合:

// Code in JS used :
$.ajax({
    'url': '/',
    'dataType': 'json',
    'type': 'POST',
    'data': {'foo': 'bar', 't': 1, 'bool': true}
});

結果 :

public static Result test() {
    ctx().request().queryString();             // {}
    ctx().request().body();                    // contains data
    ctx().request().body().asFormUrlEncoded(); // contains data
    ctx().request().body().asJson();           // empty
    return ok();
}

@BodyParser.Of(BodyParser.Json.class)

@BodyParser.Of(BodyParser.Json.class)
public static Result test() {
    ctx().request().queryString();             // {}
    ctx().request().body();                    // contains data
    ctx().request().body().asFormUrlEncoded(); // empty
    ctx().request().body().asJson();           // empty : Shouldn't this contains data since I espect JSON ?!
    return ok();
}

ここでの矛盾はasJson()、ドキュメントによると、データを返す必要があるメソッドです

注: この方法では、非 JSON リクエストに対して 400 HTTP レスポンスが自動的に返されます。(http://www.playframework.org/documentation/2.0/JavaJsonRequests)

私が知りたいのは、HTML からの単純な投稿または POST を使用した Ajax リクエストを受け入れる POST に最適なデコレータ + メソッドは何ですか?

4

2 に答える 2

7

PlayFramework が提供する Form クラスを使用することをお勧めします。フォームは、その値を提供されたリクエスト データにバインドします。

2 つの異なるフォームの実装があります。

  1. DynamicForm: POST データは Map アクセサー メソッドを介して利用できます
  2. フォーム: フォームのジェネリック フォームは、POST データをエンティティ クラスのインスタンスにマップします[詳細]

    このフォームは、自動型変換、検証、エラー報告などの便利な機能も提供します。

動的フォームを使用した簡単な例:

ajax リクエスト:

$.post("@routes.Application.movetodo()", 
    { "id": 123, "destination": destination }, function(data)
        {
           // do something when request was successfull
        });

ルート ファイル:

GET     /                           controllers.Application.index()
POST    /movetodo                   controllers.Application.movetodo()

コントローラーの実装:

public static Result movetodo()
{
    DynamicForm data = form().bindFromRequest(); // will read each parameter from post and provide their values through map accessor methods
    // accessing a not defined parameter will result in null
    String id = data.get("id");
    String destination = data.get("destination");

    return ok();
}
于 2012-06-10T12:44:37.650 に答える