Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2013-01-01) 03. 生成Http响应

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

(本文译者是爱国者)

修改Content-Type

当你使用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

comments powered by Disqus