修改默认的Content-Type
result的Content-Type会从response body的值中自动推断。举例如下:
val textResult = Ok("Hello World!")
上面的代码会自动将Content-Type设置为text/plain,如下情况:
val xmlResult = Ok(<message>Hello World!</message>)
会自动将Content-Type设置为application/xml。
提示:真正的作用类是 play.api.http.ContentTypeOf 。
默认设置能应付大部分情况,但有时你也会想手动设置。这是你只需要在result上调用 as(newContentType) 来创建一个新的Http Header:
val htmlResult = Ok(<h1>Hello World!</h1>).as("text/html")
或者使用更优雅的方式:
val htmlResult2 = Ok(<h1>Hello World!</h1>).as(HTML)
注意:使用HTML代替"text/html"的好处在于它能自动帮你设置字符集,如上面的Header最终形式将会是 text/html; charset = utf-8。
手动设置HTTP headers
你可以为result任意添加/修改HTTP头:
val result = Ok("Hello World!").withHeaders(
CACHE_CONTROL -> "max-age=3600",
ETAG -> "xx")
注意后设置Header将覆盖先设置的同名值。
设置/丢弃cookies
Cookies是特殊的HTTP头,Play提供了一系列针对Cookies的辅助方法。
你可以在HTTP响应中简单添加Cookie如下:
val result = Ok("Hello world!")
.withCookies(Cookie("theme", "blue"))
.bakeCookies()
同样可以这样来让Web浏览器丢弃保存的Cookie:
val result2 = result.discardingCookies(DiscardingCookie("theme"))
你可以在同一个响应中这样来设置/移除cookies:
val result3 = result.withCookies(Cookie("theme", "blue")).discardingCookies(DiscardingCookie("skin"))
修改text格式HTTP响应的编码
正确处理text格式的HTTP响应字符集十分重要。Play默认的字符集是utf-8。
编码将被用来:1)将text响应转换为正确格式的二进制并在网络上传输;2)使用适当的 ;charset=xxx 扩展来更新Context-Type。
编码通过play.api.mvc.Codec类被自动处理。你可以在当前上下文隐式引入一个play.api.mvc.Codec实例:
class Application @Inject()(cc: ControllerComponents) extends AbstractController(cc) {
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 Header。
如果你想了解HTML的工作原理,来看看它的定义吧:
def HTML(implicit codec: Codec) = {
"text/html; charset=" + codec.charset
}
当你需要构建自己的API来处理字符集时,请参考上面的模式。