Documentation

You are viewing the documentation for the 2.2.0 release in the 2.2.x series of releases. The latest stable release series is 2.4.x.

§レスポンスの変更

§デフォルトの Content-Type の変更

レスポンスのコンテンツタイプは、レスポンスボディとして指定された Scala の値から自動的に推論されます。

例えば、

val textResult = Ok("Hello World!")

このように記述した場合は、Content-Type ヘッダに text/plain がセットされます。また、

val xmlResult = Ok(<message>Hello World!</message>)

このように記述した場合は、Content-Type ヘッダに application/xml がセットされます。

Tip: この Content-Type の推論は、play.api.http.ContentTypeOf という型クラスによって実現されています。

これはかなり便利な機能ですが、Content-Type を任意に変更したいこともあるでしょう。そんな時は、Result の as(newContentType) というメソッドを呼び出して、Content-Type ヘッダを変更した新たなレスポンスを生成しましょう。

val htmlResult = Ok(<h1>Hello World!</h1>).as("text/html")

次のように、もう少し良い書き方もできます。

val htmlResult2 = Ok(<h1>Hello World!</h1>).as(HTML)

Note: "text/html" の代わりに HTML を利用するメリットは、フレームワークが charset を自動的に決定してくれるため、実際の Content-Type には text/html; charset=utf-8 がセットされるということです。この機能については、すぐ後で説明します。

§HTTP ヘッダの変更

任意の HTTP ヘッダを追加または更新することもできます。

val result = Ok("Hello World!").withHeaders(
  CACHE_CONTROL -> "max-age=3600",
  ETAG -> "xx")

既に値が存在する HTTP ヘッダに何か値をセットすると、上書きにより以前の値は自動的に破棄されてしまうことを覚えておいてください。

Cookie は HTTP ヘッダの特殊形でしかありませんが、扱いを楽にするためいくつかのヘルパーが用意されています。

次のように、HTTP レスポンスへ Cookie を簡単に追加することができます。

val result = Ok("Hello world").withCookies(
  Cookie("theme", "blue"))

また、既に Web ブラウザに保存されている Cookie を破棄させるには、次のように書きます。

val result2 = result.discardingCookies(DiscardingCookie("theme"))

§テキストベースの HTTP レスポンスの charset を変更する

テキストベースの HTTP レスポンスについては、charset を適切に処理することがとても重要です。Play はデフォルトで utf-8 を使い、この処理を行います。

charset はテキストベースのレスポンスをバイトデータに変換してネットワークソケット経由で送信できるようにしたり、Content-Type ヘッダを適切な ;charset=xxx で更新するために利用されます。

charset は paly.api.mvc.Codec という型クラスにより自動的に決定されます。全操作で利用される charset を変更するためには、play.api.mvc.Codec のインスタンスを implicit val として現在のスコープ内に定義してください。

object Application extends Controller {

  implicit val myCustomCharset = Codec.javaSupported("iso-8859-1")

  def index = Action {
    Ok(<h1>Hello World!</h1>).as(HTML)
  }

}

上記の例では、implicit な charset 値がスコープ内に定義されているため、Ok(...) メソッドにおいて XML メッセージを ISO-8859-1 エンコードされたバイトデータへ変換すること、また text/html; charset=iso-8859-1 という Content-Type ヘッダを生成することの二つの目的で利用されます。

ここで、HTML メソッドが一体何をしているのか疑問に思った方のために、定義をご紹介しておきます。

def HTML(implicit codec: Codec) = {
  "text/html; charset=" + codec.charset
}

一般的な方法で charset を扱う必要がある場合は、自身の API においてこれらと同じように扱うことができます。

次ページ: セッションとフラッシュスコープ