解析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又是yii\rest\Controller的子类。在yii\rest\Controller中我们发现了如下代码。

alt

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

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


签名档
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值