2012-03-12 7 views
4

私はPlayでREST Webサービスを実装しようとしています!フレームワーク。私は、複数のテンプレートを指定することによって、さまざまな形式(JSON、XML、HTMLなど)で応答を返す方法を知っています。しかし、(POSTなどの)リクエスト(エンコードされたフォーム、JSON、XMLなど)で異なるContent-Typeをどのように処理する必要があるかに関する情報は見つかりませんでした。PlayでContent-Typeをリクエストしてください! REST Webservicesのフレームワーク

特定のコンテンツタイプ(@Consumesなど)と一致するメソッドにアノテーションを付けることはできますか?コントローラメソッドで、ifを持つ異なるリクエストのContent-Typesを区別する必要がありますか?

答えて

3

注釈ではなく、ルートファイルまたはアクションのif文を使用します。あなたのユースケースに応じて、どちらが最適かが決まります。

次のURLは、コンテンツネゴシエーションのルートファイルに関する情報を提供します。 http://www.playframework.org/documentation/1.2.4/routes#content-types

GET /index.xml   Application.index(format:'xml') 
GET /index.json  Application.indexJson(format:'json') 

上記の異なるアクションを呼び出しますが、ご希望の場合は、異なるフォーマットの値と同じアクションを呼び出すことができます。

+0

私が理解している限り、参照したドキュメントの部分は結果(応答)のコンテンツタイプに関するものです。しかし、私の質問は、リクエストのコンテンツタイプ(フォームやJSONデータを含むPOSTリクエストのボディなど)に関するものです。 – raymi

+1

私はさまざまなフォーマットの処理が同じであると推測していますが、最後の応答のみが異なりますか?もしそうなら、1つのコントローラメソッドがすべてのリクエストを消費し、一般的な処理(DRY状態)を行い、次に 'request.contentType.equals(" application/json OR anything ")に基づいてそれをレンダリングする方法を決めますか? –

+0

@ Geert-Janレンダリングメソッドを呼び出すと、フォーマットに基づいてビューがレンダリングされるため、index.xmlファイルをレンダリングする場合はindex.xmlファイルをレンダリングしますが、index.jsonの場合はindex.jsonファイルを呼び出します。どちらも通常通りGroovyによって評価されますが、コントローラは同じコードを共有できますが、2つ以上の異なるビューがアタッチされています。 – Codemwnci

4

は、身体のパーサを組み合わせるためのプレイのドキュメントを見てください:

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が解析され、それに応じて処理されているかどうかを判断できます。

0

Play 2とScalaでパターンマッチングを併用すると、デフォルトのパーサーを使用することができます。

def myAction() = Action { req => 
    req.body match { 
     case AnyContentAsFormUrlEncoded(m) => 
     val f1 = m.get("field1").flatMap(_.headOption) 
     ... 
     case AnyContentAsJson(j) =>   
     val f1 = (j \ "field1").asOpt[String] 
     ... 
     case _ => //handle content types you don't support 
     ... 
} 
関連する問題