レスポンスのコンテンツタイプは、レスポンスボディとして指定された Scala の値から自動的に推論されます。
例えば、
このように記述した場合は、Content-Type
ヘッダに text/plain
がセットされます。また、
このように記述した場合は、Content-Type
ヘッダに application/xml
がセットされます。
Tip: この
Content-Type
の推論は、play.api.http.ContentTypeOf
という型クラスによって実現されています。
これはかなり便利な機能ですが、Content-Type
を任意に変更したいこともあるでしょう。そんな時は、Result の as(newContentType)
というメソッドを呼び出して、Content-Type
ヘッダを変更した新たなレスポンスを生成しましょう。
次のように、もう少し良い書き方もできます。
Note:
"text/html"
の代わりにHTML
を利用するメリットは、フレームワークが charset を自動的に決定してくれるため、実際のContent-Type
にはtext/html; charset=utf-8
がセットされるということです。この機能については、[[すぐ後|ScalaResults#テキストベースの-HTTP-レスポンスの-charset-を変更する]]で説明します。
任意の HTTP ヘッダを追加または更新することもできます。
既に値が存在する HTTP ヘッダに何か値をセットすると、上書きにより以前の値は自動的に破棄されてしまうことを覚えておいてください。
Cookie は HTTP ヘッダの特殊形でしかありませんが、扱いを楽にするためいくつかのヘルパーが用意されています。
次のように、HTTP レスポンスへ Cookie を簡単に追加することができます。
また、既に Web ブラウザに保存されている Cookie を破棄させるには、次のように書きます。
同じレスポンスの中で cookie の設定と破棄を行うこともできます:
テキストベースの HTTP レスポンスについては、charset を適切に処理することがとても重要です。Play はデフォルトで utf-8
を使い、この処理を行います(UTF-8を使う理由参照)。
charset はテキストベースのレスポンスをバイトデータに変換してネットワークソケット経由で送信できるようにしたり、Content-Type
ヘッダを適切な ;charset=xxx
で更新するために利用されます。
charset は play.api.mvc.Codec
という型クラスにより自動的に決定されます。全操作で利用される charset を変更するためには、play.api.mvc.Codec
のインスタンスを implicit val として現在のスコープ内に定義してください。
@full-application-set-myCustomCharset
上記の例では、implicit な charset 値がスコープ内に定義されているため、Ok(...)
メソッドにおいて XML メッセージを ISO-8859-1
エンコードされたバイトデータへ変換すること、また text/html; charset=iso-8859-1
という Content-Type ヘッダを生成することの二つの目的で利用されます。
ここで、HTML
メソッドが一体何をしているのか疑問に思った方のために、定義をご紹介しておきます。
一般的な方法で charset を扱う必要がある場合は、自身の API においてこれらと同じように扱うことができます。