【二 HTTP编程】3. 控制Results

修改默认的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来处理字符集时,请参考上面的模式。

转载于:https://my.oschina.net/landas/blog/1927205

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值