更改默认的内容类型
响应的实体内容的类型通常来说是被编译器通过Scala返回值类型推断出来的。例如:
val textResult = Ok("Hello World!")
该结果会被编译器在response中写为Content-Type: text/plain,而对于:
val xmlResult = Ok(<message>Hello World!</message>)
会被认为是Content-Type: application/xml。
注意:这些类型的都是由play.api.http.ContentTypeOf来确定的。
上述内容是非常有用的,但是有些时候却需要手动设置响应内容的类型。可以使用as(newContentType)方法来创建一个不同header的响应,其Content-Type不同,但是内容类似:
val htmlResult = Ok(<h1>Hello World!</h1>).as("text/html")
更好的使用方法为:
val htmlResult2 = Ok(<h1>Hello World!</h1>).as(HTML)
注意:使用HTML代替text/html时,字符集会被系统自动的设置。如果使用text/html时可以通过附加字符集的方式设置响应的字符集。例如:charset=utf-8
操作HTTP头
同样的,也可以手动操作和处理HTTP头:
val result = Ok("Hello World!").withHeaders(
CACHE_CONTROL -> "max-age=3600",
ETAG -> "xx")
需要注意的是,如果手动处理了HTTP头的内容,原先已有的设定值会被替代掉。
设置和去除cookies
Cookies是HTTP头的一种特殊形式,这里Play框架提供了一组处理器帮助使用者简化Cookies的操作。
首先,可以简便的在HTTP的Response中设置Cookie:
val result = Ok("Hello world").withCookies(
Cookie("theme", "blue"))
同时,也可以删除之前已经设定的Cookie:
val result2 = result.discardingCookies(DiscardingCookie("theme"))
在同一个Response中同时去除和设置Cookies:
val result3 = result.withCookies(Cookie("theme", "blue")).discardingCookies(DiscardingCookie("skin"))
为基于文本的HTTP响应更改字符集
使基于文本的HTTP响应用正确的字符集进行处理是非常重要的。Play框架在处理这些响应时是使用UTF-8字符集作为默认字符集的。
字符集通常用于1)将文本响应转换成适合通过网络Socket传播的适当的字节码;2)更改响应头中的Content-Type的内容为——“;charSet=xxx”。
字符集的处理通常是自动的通过play.api.mvc.Codec进行的。通过引入一个隐式的play.api.mvc.Codec的实例,可以将当前作用域内的字符集设置为你想要的字符集。
object Application extends Controller {
implicit val myCustomCharset = Codec.javaSupported("iso-8859-1")
def index = Action {
Ok(<h1>Hello World!</h1>).as(HTML)
}
}
正是由于当前作用域内的这个隐式的对象,可以使用OK{…}方法返回一个基于ISO-8859-1编码的字节码流,也可以通过生成text/html;charset=iso-8859-1作为响应头部Content-Type的内容。
如果想要了解这段字符集定义的隐式转换是如何工作的,下面便是它是如何定义的:
def HTML(implicit codec: Codec) = {
"text/html; charset=" + codec.charset
}