操纵Results
更改默认的 Content-Type
result的content type是从你指定的响应体的Scala值中自动推断的。
举例:
val textResult = Ok("Hello World!")
会自动设置Content-Type
标头为text/plain
, 而:
val xmlResult = Ok(<message>Hello World!</message>)
会设置 Content-Type 标头为application/xml
.
提示: 这是由
play.api.http.ContentTypeOf
type类完成的。
这相当有用, 但有时候你想要更改它。只需使用result的as(newContentType)
方法来创建一个新的、类似的、带有不同的Content-Type
标头的 result:
val htmlResult = Ok(<h1>Hello World!</h1>).as("text/html")
或甚至更好的方法, 使用:
val htmlResult2 = Ok(<h1>Hello World!</h1>).as(HTML)
注意: 使用
HTML
而非"text/html"
的好处是会为你自动处理字符集,并且实际Content-Type 标头会设置为text/html; charset=utf-8
。我们会 看到这一点.
操纵HTTP标头
你也可以添加(或更新)任何HTTP标头到result:
val result = Ok("Hello World!").withHeaders(
CACHE_CONTROL -> "max-age=3600",
ETAG -> "xx")
请注意如果原来的result已经有一个标头了,设置一个新的HTTP标头会自动覆盖前面的值。
设置和丢弃cookies
Cookies 只是一种特殊的HTTP标头,但我们提供了一系列的助手方法来简化操作。
你可以很容易地添加一个Cookie到HTTP响应中:
val result = Ok("Hello world").withCookies(
Cookie("theme", "blue"))
此外, 要丢弃之前存储在Web浏览器中的Cookie:
val result2 = result.discardingCookies(DiscardingCookie("theme"))
你也可以在同一个响应中同时设置和移除cookies:
val result3 = result.withCookies(Cookie("theme", "blue")).discardingCookies(DiscardingCookie("skin"))
改变基于文本的HTTP响应的字符集
对于基于文本的HTTP响应,正确处理字符集是非常重要的。Play为你处理它,并采用utf-8
为默认值(参阅为什么使用utf-8)。
字符集既转换文本响应到相应的字节来通过网络套接字发送, 亦使用正确的;charset=xxx
扩展来更新Content-Type
标头。
字符集通过play.api.mvc.Codec
type类自动处理。只需导入一个隐式play.api.mvc.Codec
实例到当前作用域,以改变所有操作将会用到的字符集:
class Application extends Controller {
implicit val myCustomCharset = Codec.javaSupported("iso-8859-1")
def index = Action {
Ok(<h1>Hello World!</h1>).as(HTML)
}
}
这里因为作用域中有一个隐式字符集的值, 它会用于Ok(...)
方法来转换 XML 消息为ISO-8859-1
编码的字节,同时也生成text/html; charset=iso-8859-1
Content-Type 标头。
现在如果你想知道HTML
方法是如何工作的, 以下是它的定义:
def HTML(implicit codec: Codec) = {
"text/html; charset=" + codec.charset
}
如果你的API中需要用通用的方法处理字符集,你可以按上面同样的方法操作。