は、身体のパーサを組み合わせるためのプレイのドキュメントを見てください:
http://www.playframework.com/documentation/2.2.0/ScalaBodyParsers
あなただけのXMLまたはJSONにポスト本体を制約する場合は、これらの線に沿って何かを書くことができます。
val xmlOrJson = parse.using {
request =>
request.contentType.map(_.toLowerCase(Locale.ENGLISH)) match {
case Some("application/json") | Some("text/json") => play.api.mvc.BodyParsers.parse.json
case Some("application/xml") | Some("text/xml") => play.api.mvc.BodyParsers.parse.xml
case _ => play.api.mvc.BodyParsers.parse.error(Future.successful(UnsupportedMediaType("Invalid content type specified")))
}
}
def test = Action(xmlOrJson) {
request =>
request.body match {
case json: JsObject => Ok(json) //echo back posted json
case xml: NodeSeq => Ok(xml) //echo back posted XML
}
}
xmlOrJson関数は、コンテンツタイプ要求ヘッダーを参照してボディパーサーを判別します。 xmlまたはjsonでない場合は、UnsupportedMediaTypeレスポンス(HTTP 415)を使用してエラーボディパーサを返します。
次に、この関数を、xmlまたはjsonのコンテンツに制約するアクションのボディパーサーとして渡します。アクション内では、本文を見て、xmlまたはjsonが解析され、それに応じて処理されているかどうかを判断できます。
私が理解している限り、参照したドキュメントの部分は結果(応答)のコンテンツタイプに関するものです。しかし、私の質問は、リクエストのコンテンツタイプ(フォームやJSONデータを含むPOSTリクエストのボディなど)に関するものです。 – raymi
私はさまざまなフォーマットの処理が同じであると推測していますが、最後の応答のみが異なりますか?もしそうなら、1つのコントローラメソッドがすべてのリクエストを消費し、一般的な処理(DRY状態)を行い、次に 'request.contentType.equals(" application/json OR anything ")に基づいてそれをレンダリングする方法を決めますか? –
@ Geert-Janレンダリングメソッドを呼び出すと、フォーマットに基づいてビューがレンダリングされるため、index.xmlファイルをレンダリングする場合はindex.xmlファイルをレンダリングしますが、index.jsonの場合はindex.jsonファイルを呼び出します。どちらも通常通りGroovyによって評価されますが、コントローラは同じコードを共有できますが、2つ以上の異なるビューがアタッチされています。 – Codemwnci