内容协商可以通过指定请求头以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") |