Postではアクションメソッドへパラメータがマッピングされない

うーん、どうも仕様らしいので対応せざるを得ないですね。

下記のようにGETで指定した場合はアクションメソッドのパラメーターにパラメータクエリがマッピングされるのですが、これをPOSTにするとエラーになります。

[sourcecode language="scala"]

// Routes GET /foo/bar controllers.Foo.bar(a:String, b:String, c:Int=0)

// この場合は正常に出力される def bar(a:String, b:String, c:Int) = Action{ Ok("bar:" + a + " b:" + b + " c:" + c.toString) } [/sourcecode]

上記についてRoutesファイルのGETをPOSTへ変更するとエラーになります。

[sourcecode language="scala"]

// Routes POST /foo/bar controllers.Foo.bar(a:String, b:String, c:Int=0)

// この場合は[Missing parameter: a]が表示される def bar(a:String, b:String, c:Int) = Action{ Ok("bar:" + a + " b:" + b + " c:" + c.toString) } [/sourcecode]

最初は当たり前のようにPOSTでパラメータを渡そうとしてうまくいかずいろいろと調べたのですが、結局のところ仕様としてPOSTの場合はアクションメソッドにパラメータを定義してはいけないようです。

play-framework ›[2.0] Form submission not working for POST but ok for GET method

では、どうすればいいかというとReqest#bodyを利用してごにょごにょすることになります。 この辺は、こちらの書籍がわかりやすく書いてありますね。

※Play20についても記載されているので、とっかかりにはよいと思います。