§コンテンツネゴシエーション
コンテンツネゴシエーションは、同じリソース(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/html
とapplication/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/mp3
MIMEタイプと一致することを確認する抽出器を作成します。
val AcceptsMp3 = Accepting("audio/mp3")
render {
case AcceptsMp3() => ???
}
}
次へ: エラー処理
このドキュメントにエラーを発見しましたか?このページのソースコードはこちらにあります。ドキュメントガイドラインを読んだ後、プルリクエストを送信してください。質問やアドバイスを共有したいですか?コミュニティフォーラムにアクセスして、コミュニティとの会話を始めましょう。