内容协商可以通过指定请求头以Accept*
形式,对同一个请求地址,可以响应不同的内容。这在对一个服务支持xml或json格式的情况下很有用。
Language
在Play中可以通过play.api.mvc.RequestHeader#acceptLanguages
方法获取支持的语言类型,它返回一个列表,通过解析请求的Accept-Language
请求头,根据他们的quality value进行排序,如zh-CN,zh;q=0.8
, 它的quality value为0.8。在Play中有一个隐式转换,转成Lang
类型,如:
1 | implicit def request2lang(implicit request: RequestHeader): Lang = { |
它会找出排序过后列表中第一个支持的语言。
Content
类似地,play.api.mvc.RequestHeader#acceptedTypes
方法会返回请求支持的MIME类型,它是通过解析请求头的Accept
参数得到的,并根据quality因子进行排序。可以通过以下的方法来处理:
1 | def custom() = Action { implicit request => |
它解析Accept
请求头,如果包含text/html
,则返回index页面,如果包含application/json
,则返回JSON格式的内容,如果请求头指定的是application/xml
, 则会返回val NOT_ACCEPTABLE = 406
。
请求抽取器
可以通过play.api.mvc.Accepting
这个case class来自定义请求头抽取器,如:
1 | val AcceptsMp3 = Accepting("audio/mp3") |