(本文译者是爱国者)
当你使用Play提供的工具函数生成Http响应,Play会为Content-Type
选择一个合适的值. 比如Ok("Hello World")
函数会将Content-Type
的值设为text/plain
,Ok(<message>Hello world</message>)
会将Content-Type
的值设为
// set Content-Type to text/plain
val textResult = Ok("Hello World!")
// set Content-Type to text/xml
val xmlResult = Ok(<message>Hello World!</message>)
> **提示:** Play实际上是使用`play.api.http.ContentTypeOf`来完成`Content-Type`的类型选择
你也可以使用`as(newContentType)`显式指定`Content-Type`的值:
val htmlResult = Ok(<h1>Hello World!</h1>).as("text/html")
或者
val htmlResult = Ok(<h1>Hello World!</h1>).as(HTML)
> **注意:** 使用`HTML`辅助函数的好处是Play会自动为你添加html页面的字符编码,也就说`Content-Type`的值会被设置成形如`text/html; charset=UTF-8`
#### 修改Http响应头
Play提供了工具函数让你随意添加和修改Http响应头
Ok("Hello World!").withHeaders(
CACHE_CONTROL -> "max-age=3600",
ETAG -> "xx"
)
> **注意:**, 添加或修改的Http响应头会覆盖之前或默认的值
#### 设置和删除cookies
Cookie是一种特殊的Http响应头。Play提供了一组工具函数方便设置Cookies,比如:
Ok("Hello world").withCookies(
Cookie("theme", "blue")
)
要删除某个cookie,可以这样做:
Ok("Hello world").discardingCookies("theme")
#### 修改响应文本的字符集
给响应文本设置正确的字符集是非常重要的。Play默认采用UTF-8字符集
这里所说的字符集,有两个用途。一是用于将响应文本转换成字节流,然后通过网络传输给浏览器, 二是用于设置`Content-Type`的字符集。你可以选择其他字符集,比如ISO-8859-1:
object Application extends Controller {
implicit val myCustomCharset = Codec.javaSupported("iso-8859-1")
def index = Action {
Ok(<h1>Hello World!</h1>).as(HTML)
}
}
这里我们定义了一个隐式字符集变量值(`myCustomCharset`),它会被`Ok(..)`函数用于将XML文本转成`ISO-8859-1`编码的字节流,被HTML函数将`Content-Type`的值设置为`text/html; charset=iso-8859-1`
实际上HTML函数是这样定义的:
def HTML(implicit codec: Codec) = {
"text/html; charset=" + codec.charset
}
当然你可以显式指定字符集(而不采用隐式转换的方法)
译者:我认为恰当使用隐式转换可以让代码更简洁
原文: https://github.com/playframework/Play20/wiki/ScalaResults