解析yii2内置响应协商行为类 - ContentNegotiator

阿北

通过分析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筛选器使用,看它的层级关系一目了然。

alt

它是筛选器,它也是行为。

一个例子

有一个控制器叫做NegController,它有两个action,我希望都返回json类型的数据,则可以这样配置。

alt

就是绑定了一个行为,通过配置ContentNegotiator的formats可以限定返回的类型,并且可以指定只是针对于index和list有效,当然如果你只想剔除某个action,可以使用except参数。

接下来我们看看actionIndex,我们其实返回了一个结果集。看看浏览器端的表现。

alt

大家看到了,忽略了Request对响应格式的说明,并且将结果集转换成json格式直接返回。

当然我们可以指定多种,这样yii2会根据Request中header的accept字段进行分析。比如下图

alt

比如我设定我想接收json类型的数据,则ContentNegotiator会对其进行匹配。

alt

这是第一种方法,我们可以针对于一个控制器进行筛选和内容协商,另外我们可以针对于整个yii2程序进行协商,比如你的程序是手机应用的接口后台,全部需要json格式。

全局协商

就是上面的需求,我们可以在配置文件里进行处理 config/web.php,因为ContentNegotiator要在action之前分析过来的请求头,因此对于全局设置,我们需要放到web.php的bootstrap进行预加载。

alt

简单的设置一下,整个程序都返回json格式了。

RESTful

针对于普通程序可能这种响应格式统一化还不明显,不过针对于比如app就很重要了,或是统一返回xml、或是json,他们代表纯数据。

在yii2的RESTful模块中,ContentNegotiator也起到了重要作用并且贯穿于所有的控制器。

我们都知道对于RESTful,每个控制器需要继承ActiveController,而ActiveController又是yiirestController的子类。在yiirestController中我们发现了如下代码。

alt

你明白了吧,也就是说所有的RESTful下的action都返回xml或json格式的数据,具体是谁可以根据请求header来。关于这点,我们在开发RESTful程序时候要特别注意。

当然不仅仅如此,ContentNegotiator还可以根据语言进行协商并返回对应的数据,感兴趣的伙伴可以自行研究下,思路差不多。


签名档

阅读 3.4k

阿北哥ya
阿北,一名独立开发者、讲师和奶爸。本专栏主要分享一些技术文章和独立开发经验。
4.1k 声望
909 粉丝
0 条评论
4.1k 声望
909 粉丝
文章目录
宣传栏