Yii轻松实现RESTful风格的接口
创建api模块
我们可以直接复制一份其他的模块,如 frontend
模块,假设起名为 restful
修改配置
首先我们修改一下配置,为了能够实现模块的自动加载
创建控制器
创建控制器就更简单了
info: 上述配置是可选的。若未按上述配置,API 将仅可以分辨
application/x-www-form-urlencoded
和multipart/form-data
输入格式。也就是通过$_POST
进行获取参数。
我们可以看一下 Request
类的 getBodyParams
方法,方法中会根据请求的 Content-Type
来用不同的解析器解析请求参数,这里配置的 'application/json' => 'yii\web\JsonParser'
就是为了能够在请求头参数为 Content-Type:application/json
时请求体的json数据能够很好的被解析
路由配置
常用的参数如下
看一下 yii\rest\UrlRUle
路由为我们做了什么
这部分是yii为我们配置的默认的路由,什么方式的请求指定到对应的 action
资源设置
可以根据url上设置参数来获取指定的字段值, 看一下官方案例
fields() 方法默认返回的是表解析出来的所有字段
extraFields() 方法需要自己写,返回的是关联的属性
覆盖 fields() 方法
官方案例
覆盖 extraFields() 方法
要想返回关联属性,需要让 extraFields()
方法返回关联属性,如下
请求 :GET rest.yiilearn.com/products?fields=product_id,purchase_id&expand=user
可以看到,expand的参数生效了,但是返回的数据有太多,我们缩减一下
返回结果
AR这种联表方式还是有点复杂的,不推荐。可以参考下面的自定义部分
控制器设置
控制器需要改变的比较少,无非就是添加一些路由配置的额外的要实现的 action
,覆盖一些 behavior
,重写一下检查权限的方法 checkAccess()
先看案例
控制器的过滤器解析
下面我们主要看一下 behaviors
部分
格式化响应 contentNegotiator
这个配置相对简单,我们只需要在请求头中加入指定响应格式的参数即可获取对应格式的数据
用户验证
yii提供了多种验证方法,这里以 HttpBearerAuth
验证(head头获取token)为例
|
|
此时,我们就可以通过获取到(通常是通过登录获取到的)的 token
进行请求了
固定格式
"Authorization":"Bearer " + $token
速率验证
在 实现了用户验证后速率验证才会有用 ,我们需要 User
实现几个方法,如下
首先我们需要在 user
表添加两个字段用来存储剩余次数和访问时间 allowance
, allowance_updated_at
实现起来就是这么简单
自定义action
yii配置成 restful 风格的接口确实很快。但我们有时想要额外的添加或重写一些 action ,或者觉得 AR 联表太过麻烦,这是我们就要了解一下逻辑原理然后对其进行扩展
这里有个很重要的点,就是在执行完 action 后,会对action输出的结果记性格式化
也就是说以上两种类型 Arrayable
和 DataProviderInterface
就将会进行格式化,具体的格式化代码自己看( 其中 Model
的 toArray()
方法实现了请求时的资源字段)。所以如果我们想要模仿,也可以输出这两种格式的数据,当然也可以自己处理格式直接输出数据。
扩展 action 的方式
为该控制器的路由配置
extraPatterns
属性123456789101112'rules' => [['class' => 'yii\rest\UrlRule','controller' => 'product',...// 配置额外自定义的访问// 访问格式如 POST /products/search 可以支持新行为 search'extraPatterns' => ['POST search' => 'search',],],],该控制器添加对应的action
12345678910111213141516171819202122232425/*** 添加额外配置的action* @return [type] [description]*/public function actionSearch(){# 直接返回数据// return Yii::$app->request->post();# 通过 Query 查询 返回 ActiveDataProvider 的方式$query = (new Query)->from('meet_product mp')->leftJoin('meet_color mc', 'mc.color_id = mp.color_id');return Yii::createObject(['class' => ActiveDataProvider::className(),'query' => $query,'pagination' => [// 默认每页显示多少个数据'defaultPageSize' => 30,'params' => [// 第几页的参数'page' => 1],],]);}通过
POST /controllerIds/search
即可访问
删除指定 action
删除指定 action ,重写 actions()
删除掉指定的 action
覆盖 action 的方式
覆盖的方式不用改路由,但是由于创建action的时候优先 actions()
方法中定义的,所以我们需要先将指定的 action删除掉,参考上面,然后在 Controller
中定义要重写的 action