Documentation

You are viewing the documentation for the 2.3.x release series. The latest stable release series is 2.4.x.

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

コンテンツネゴシエーションとは、同一のリソース (URI) を複数のフォーマットで提供するためのメカニズムです。用途としては、 例えば 複数の出力フォーマット (XML, JSON など) をサポートするような Web サービスを実装する場合です。サーバ駆動のネゴシエーションは Accept* リクエストヘッダの内容に基いて行われます。コンテンツネゴシエーションについての詳細は HTTP の仕様 を参照してください。

§言語

play.api.mvc.RequestHeader#acceptLanguages メソッドを呼び出すと、リクエストの Accept-Language ヘッダから、クライアント側で受付可能な言語のリストを取り出すことができます。リストは quality 値によってソートされます。Play は play.api.mvc.Controller#lang メソッド内でこのメソッドを呼び出して、暗黙の値 play.api.i18n.Lang をアクションのスコープ内に提供しています。これによって、アクション内では常に最適な言語 (クライアントが希望している言語をあなたのアプリケーションがサポートしている場合はそれを、そうでなければアプリケーションのデフォルト言語が代わりに提供されます) を利用することができます。 

§コンテンツ

同様に、play.api.mvc.RequestHeader#acceptedTypes メソッドを呼び出すことで、リクエストの Accept ヘッダから、クライアント側で受付可能な MIME タイプのリストを取り出すことができます。リストは quality 値でソートされます。

実際には、Accept ヘッダーは実際には MIME タイプではなくメディアレンジを含みます (例えば、すべてのテキスト結果を受け入れるリクエストは text/* レンジを設定し、*/* レンジはすべての結果タイプを受け入れることができる)。コントローラはメディアレンジを扱うのに役立つ、より高いレベルの render メソッドを提供します。たとえば、次のアクション定義を考えてみましょう。

val list = 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 を返す PartialFunction を引数にとり、リクエストの Accept ヘッダ内のメディアレンジに優先度順に適用します。その PartialFunction で受け入れ可能なメディアレンジが一つも存在しない場合、 NotAcceptable という結果が返ります。

例えば、クライアントが */*;q=0.5,application/json という Accept ヘッダを持つリクエストを送信したとします。これは、任意の型の結果を受け入れるが JSON を優先する、という意味で、この場合、上記のコードは JSON 形式の結果を返します。同様に、クライアントが application/xml という Accept ヘッダを持つリクエストを送信したとします。これは、XML のみ受け付けるという意味で、この場合は上記のコードは NotAcceptable を返します。

§リクエスト抽出子

play.api.mvc.AcceptExtractors.Accepts オブジェクトの API ドキュメントには、 Play が render メソッドにてデフォルトでサポートしている MIME タイプの一覧が掲載されています。 play.api.mvc.Accepting ケースクラスを使うと、任意の MIME タイプに対応する独自の抽出子を簡単に作成することができます。例えば、次のコードは、メディアレンジが audo/mp3 MIME タイプにマッチするかどうかをチェックする抽出子を作成します。

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

次ページ: 非同期 HTTP プログラミング


このドキュメントの翻訳は Play チームによってメンテナンスされているものではありません。 間違いを見つけた場合、このページのソースコードを ここ で確認することができます。 ドキュメントガイドライン を読んで、お気軽にプルリクエストを送ってください。