Manipulating Results[翻译]


改变默认的Content-Type

结果的内容类型是自动地通过的指定的相应体的Scala值推断而来。

例如:

val textResult = Ok("Hello World!")  

将会自动的设置Content-Type头为text/plain,而:

将会设置 Content-Type 头为application/xml。

.提示:这是通过play.api.http.ContentTypeOf类型的类完成。

这是十分有用的,但是有时你想改变它,就只是在结果上使用as(newContentType)方法创建一个新的使用不同Content-Type头的类似的结果:

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头:

val result = Ok("Hello World!").withHeaders(  
CACHE_CONTROL -> "max-age=3600",  
ETAG -> "xx")  

注意,如果原来的值里有HTTP头,那么在设置HTTP头将会自动的去掉。

设置和去掉Cookies

Cookies只是HTTP头的特殊格式。但是我们提供了一组帮助类,让它更容易使用。

你可以容易的增加一个Cookie到HTTP相应,使用:

val result = Ok("Hello world").withCookies(  
Cookie("theme", "blue"))  

当然也会去掉在网络流量器上之前存储的Cookie:

val result2 = result.discardingCookies(DiscardingCookie("theme"))  

你也可以设置或移除Cookie作为相同响应的部分:

val result3 = result.withCookies(Cookie("theme", "blue")).discardingCookies(DiscardingCookie("skin"))  

改变基于HTTP响应文本的字符集

对于基于HTTP响应文本来说,正确的处理字符集是非常重要的。Play为你处理这些,并默认使用UTF-8. 字符集即被被用来报转换文本响应转换成相应的字节发送给网络套接字,也被用来使用适当的;charset=xxx扩展更新 Content-Type头。

play.api.mvc.Codec 类自动的处理字符集。只需要在正确的作用域导入一个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-1Content-Type 头。 现在,如果你想知道HTML方法的原理,这里是它是怎么定义的:

def HTML(implicit codec: Codec) = {  
"text/html; charset=" + codec.charset
}

如果你需要使用通用的方式处理字符集, 你可以在你的API中这样做。

祝青

继续阅读此作者的更多文章