ドキュメント

§コンテンツネゴシエーション

コンテンツネゴシエーションは、同じリソース(URI)に対して異なる表現を提供することを可能にするメカニズムです。これは、複数の出力形式(XML、JSONなど)をサポートするWebサービスを作成する場合に役立ちます。サーバー主導のネゴシエーションは、本質的にAccept*リクエストヘッダーを使用して実行されます。コンテンツネゴシエーションの詳細については、HTTP仕様を参照してください。

§言語

Accept-Languageヘッダーから取得し、品質値に従ってソートするplay.api.mvc.RequestHeader#acceptLanguagesメソッドを使用して、リクエストの許容可能な言語のリストを取得できます。Playは、アクションに暗黙的なplay.api.i18n.Lang値を提供するplay.api.mvc.Controller#langメソッドで使用し、自動的に最適な言語を使用します(アプリケーションでサポートされている場合。サポートされていない場合は、アプリケーションのデフォルト言語が使用されます)。

§コンテンツ

同様に、play.api.mvc.RequestHeader#acceptedTypesメソッドは、リクエストに対する許容可能な結果のMIMEタイプのリストを提供します。これは、Acceptリクエストヘッダーから取得され、品質係数に従ってソートされます。

実際、AcceptヘッダーはMIMEタイプを本当に含んでいるわけではなく、メディア範囲です(例:すべてのテキスト結果を受け入れるリクエストはtext/*範囲を設定し、*/*範囲はすべての結果タイプが受け入れられることを意味します)。コントローラーは、メディア範囲の処理を支援するより高レベルのrenderメソッドを提供します。たとえば、次のアクション定義を考えてみてください。

val list: Action[AnyContent] = Action { implicit request =>
  val items = Item.findAll
  render {
    case Accepts.Html() => Ok(views.html.list(items))
    case Accepts.Json() => Ok(Json.toJson(items))
  }
}

Accepts.Html()Accepts.Json()は、与えられたメディア範囲がそれぞれtext/htmlapplication/jsonと一致するかどうかをテストする抽出器です。renderメソッドは、play.api.http.MediaRangeからplay.api.mvc.Resultへの部分関数を取り、優先順位に従ってリクエストのAcceptヘッダーに見つかった各メディア範囲に適用しようとします。許容可能なメディア範囲のどれも関数でサポートされていない場合、NotAcceptable結果が返されます。

たとえば、クライアントがAcceptヘッダーに次の値でリクエストを行う場合:*/*;q=0.5,application/json(任意の結果タイプを受け入れるがJSONを優先することを意味します)、上記のコードはJSON表現を返します。別のクライアントがAcceptヘッダーに次の値でリクエストを行う場合:application/xml(XMLのみを受け入れることを意味します)、上記のコードはNotAcceptableを返します。

§リクエスト抽出器

play.api.mvc.AcceptExtractors.AcceptsオブジェクトのAPIドキュメントを参照して、renderメソッドでPlayがすぐにサポートするMIMEタイプのリストを確認してください。play.api.mvc.Acceptingケースクラスを使用して、特定のMIMEタイプに対する独自の抽出器を簡単に作成できます。たとえば、次のコードは、メディア範囲がaudio/mp3MIMEタイプと一致することを確認する抽出器を作成します。

  val AcceptsMp3 = Accepting("audio/mp3")
  render {
    case AcceptsMp3() => ???
  }
}

次へ: エラー処理


このドキュメントにエラーを発見しましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを送信してください。質問やアドバイスを共有したいですか?コミュニティフォーラムにアクセスして、コミュニティとの会話を始めましょう。