PlayframeworkのFilterでPOSTデータが受け取ることができない
FilterでPOSTデータを取り出したかったが、うまく取り出すことができなかったのでソースコードを見ながら調べてみた。
原因はForm.bindFromRequestの引数がplay.api.mvc.Request[]であること。
play.api.data.Form.bindFromRequest
Filterの引数となっているRequestHeaderではリクエストボディを見ることができない。
play.api.mvc.RequestHeader
Request[]の初期化にRequestHeaderとbodyを渡しているよう。
play.api.mvc.Request
対応策
ActionBuilderを拡張してPOSTデータを受け取って処理を行うようにし、各Controllerで使用するようにした。
object ActionTest extends ActionBuilder[Request] {
val testForm = Form("test" -> text)
def invokeBlockA: Future[Result] = {
if (testForm.bindFromRequest.value.isDefined) {
block(request)
} else {
Future.successful(Ok("error"))
}
}
}
上記対応を行ってもうまくいかない場合はRequestHeaderのcontent-typeを確認し、下記関数内でどのように扱われているのか確認すべし。
play.api.mvc.ContentTypes.anyContent
content-typeを明記しておらず、AnyContentAsRawとして処理されていたためPOSTデータを受け取れない場合があった。