通过分析Request的header来返回对应的数据格式。
在开始之前我们先说一下yii2的Response类内置都可以返回什么类型的响应格式,一共5种,当然你也可以自定义其他的。
FORMAT_RAW
FORMAT_HTML
FORMAT_JSON
FORMAT_JSONP
FORMAT_XML
在我们响应浏览器的时候可以设置如上的格式。
ContentNegotiator是干嘛的?它可以分析Request的header然后指派所需的响应格式给客户端,不需要我们人工指定,当然它也是action的筛选器,比如ContentNegotiator限定了只能返回FORMAT_JSON,则就算客户端请求一个xml格式的数据,也徒劳。
一般ContentNegotiator都是作为action筛选器使用,看它的层级关系一目了然。
它是筛选器,它也是行为。
一个例子
有一个控制器叫做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格式了。
RESTful
针对于普通程序可能这种响应格式统一化还不明显,不过针对于比如app就很重要了,或是统一返回xml、或是json,他们代表纯数据。
在yii2的RESTful模块中,ContentNegotiator也起到了重要作用并且贯穿于所有的控制器。
我们都知道对于RESTful,每个控制器需要继承ActiveController,而ActiveController又是yiirestController的子类。在yiirestController中我们发现了如下代码。
你明白了吧,也就是说所有的RESTful下的action都返回xml或json格式的数据,具体是谁可以根据请求header来。关于这点,我们在开发RESTful程序时候要特别注意。
当然不仅仅如此,ContentNegotiator还可以根据语言进行协商并返回对应的数据,感兴趣的伙伴可以自行研究下,思路差不多。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。