经过分析Request的header来返回对应的数据格式。php
在开始以前咱们先说一下yii2的Response类内置均可以返回什么类型的响应格式,一共5种,固然你也能够自定义其余的。web
FORMAT_RAWjson
FORMAT_HTMLbootstrap
FORMAT_JSON浏览器
FORMAT_JSONPyii2
FORMAT_XMLapp
在咱们响应浏览器的时候能够设置如上的格式。yii
ContentNegotiator是干吗的?它能够分析Request的header而后指派所需的响应格式给客户端,不须要咱们人工指定,固然它也是action的筛选器,好比ContentNegotiator限定了只能返回FORMAT_JSON,则就算客户端请求一个xml格式的数据,也徒劳。spa
通常ContentNegotiator都是做为action筛选器使用,看它的层级关系一目了然。rest
它是筛选器,它也是行为。
有一个控制器叫作NegController,它有两个action,我但愿都返回json类型的数据,则能够这样配置。
就是绑定了一个行为,经过配置ContentNegotiator的formats能够限定返回的类型,而且能够指定只是针对于index和list有效,固然若是你只想剔除某个action,可使用except参数。
接下来咱们看看actionIndex,咱们其实返回了一个结果集。看看浏览器端的表现。
你们看到了,忽略了Request对响应格式的说明,而且将结果集转换成json格式直接返回。
固然咱们能够指定多种,这样yii2会根据Request中header的accept字段进行分析。好比下图
好比我设定我想接收json类型的数据,则ContentNegotiator会对其进行匹配。
这是第一种方法,咱们能够针对于一个控制器进行筛选和内容协商,另外咱们能够针对于整个yii2程序进行协商,好比你的程序是手机应用的接口后台,所有须要json格式。
就是上面的需求,咱们能够在配置文件里进行处理 config/web.php,由于ContentNegotiator要在action以前分析过来的请求头,所以对于全局设置,咱们须要放到web.php的bootstrap进行预加载。
简单的设置一下,整个程序都返回json格式了。
针对于普通程序可能这种响应格式统一化还不明显,不过针对于好比app就很重要了,或是统一返回xml、或是json,他们表明纯数据。
在yii2的RESTful模块中,ContentNegotiator也起到了重要做用而且贯穿于全部的控制器。
咱们都知道对于RESTful,每一个控制器须要继承ActiveController,而ActiveController又是yiirestController的子类。在yiirestController中咱们发现了以下代码。
你明白了吧,也就是说全部的RESTful下的action都返回xml或json格式的数据,具体是谁能够根据请求header来。关于这点,咱们在开发RESTful程序时候要特别注意。
固然不单单如此,ContentNegotiator还能够根据语言进行协商并返回对应的数据,感兴趣的伙伴能够自行研究下,思路差很少。