§レスポンスの変更
§デフォルトの Content-Type の変更
レスポンスのコンテンツタイプは、レスポンスボディとして指定された Scala の値から自動的に推論されます。
例えば、
val textResult = Ok("Hello World!")
このように記述した場合は、Content-Type
ヘッダに text/plain
がセットされます。また、
val xmlResult = Ok(<message>Hello World!</message>)
このように記述した場合は、Content-Type
ヘッダに text/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 htmlResult = Ok(<h1>Hello World!</h1>).as(HTML)
Note:
"text/html"
の代わりにHTML
を利用するメリットは、フレームワークが charset を自動的に決定してくれるため、実際のContent-Type
にはtext/html; charset=utf-8
がセットされるということです。この機能については、すぐ後で説明します。
§HTTP ヘッダの変更
任意の HTTP ヘッダを追加または更新することもできます。
Ok("Hello World!").withHeaders(
CACHE_CONTROL -> "max-age=3600",
ETAG -> "xx"
)
既に値が存在する HTTP ヘッダに何か値をセットすると、上書きにより以前の値は自動的に破棄されてしまうことを覚えておいてください。
§cookie の設定と破棄
Cookie は HTTP ヘッダの特殊形でしかありませんが、扱いを楽にするためいくつかのヘルパーが用意されています。
次のように、HTTP レスポンスへ Cookie を簡単に追加することができます。
Ok("Hello world").withCookies(
Cookie("theme", "blue")
)
また、既に Web ブラウザに保存されている Cookie を破棄させるには、次のように書きます。
Ok("Hello world").discardingCookies("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 においてこれらと同じように扱うことができます。
次ページ: セッションとフラッシュスコープ