最近在研究 yii2 如何搭建 restful api,将心得写下,欢迎一起讨论

使用yii2.0.13 advanced 版,将 frontend 整个作为 api 接口项目,除了接口的路由规则可以认证通过外,其他的路由规则都返回请求错误的格式

1、数据库结构

CREATE TABLE `goods` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT,

`name` varchar(255) NOT NULL,

`price` int(11) unsigned NOT NULL,

`status` tinyint(1) unsigned NOT NULL,

`create_time` int(11) unsigned NOT NULL,

`modify_time` int(11) unsigned NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2、使用 gii 创建 goods model

3、创建 api modules

在 frontend 下新建文件夹 modules

使用 gii 在 modules 文件中创建 v1 module(防止以后接口更新替换时向前兼容,接口增加 v1 v2 等版本控制)

4、将 v1 moduel 写到配置文件中

'modules' => [

'v1' => [

'class' => 'frontend\modules\v1\Module',

],

],

5、修改 frontend 下 main.php 中,user 的配置(以下说的配置文件,都是 frontend 下 main.php)

'user' => [

'identityClass' => 'frontend\models\User',

'enableAutoLogin' => false,

'enableSession' => false,

'loginUrl' => null,

],

6、新建 frontend\models\User,继承 common\models\User

namespace frontend\models;

class User extends \common\models\User{

}

7、启用并修改配置文件中的 urlManager

调试 urlManager 的时候要小心,他会将生成好的路由写入缓存(默认是文件缓存),有些更改可能不会立马生效

'urlManager' => [

//用于表明 urlManager 是否启用 URL 美化功能

//默认不启用。但实际使用中,特别是产品环境,一般都会启用

'enablePrettyUrl' => true,

//是否启用严格解析,如启用严格解析,要求当前请求应至少匹配1个路由规则,否则认为是无效路由。

//这个选项仅在 enablePrettyUrl 启用后才有效。

//如果开启,表示只有配置在 rules 里的规则才有效

//由于项目会将一些 url 进行优化,所以这里需要设置为 true

'enableStrictParsing' => true,

//指定是否在URL在保留入口脚本 index.php

'showScriptName' => false,

'rules' => [

//当然,如果自带的路由无法满足需求,可以自己增加规则

'GET //search' => '//search',

[

'class' => 'yii\rest\UrlRule',

'controller' => ['v1/goods'],

// 由于 resetful 风格规定 URL 保持格式一致并且始终使用复数形式

// 所以如果你的 controller 是单数的名称比如 UserController

// 设置 pluralize 为 true (默认为 true)的话,url 地址必须是 users 才可访问

// 如果 pluralize 设置为 false, url 地址必须是 user 也可访问

// 如果你的 controller 本身是复数名称 UsersController ,此参数没用,url 地址必须是 users

'pluralize' => false,

],

],

],

8、去掉配置文件中的 errorHandler 配置(整个 frontend 都是接口,不需要 html 的响应格式)

9、将内容协商配置到引导文件中(因为整个 frontend 都需要)

'bootstrap' => [

'log',

//全局内容协商

[

//ContentNegotiator 类可以分析request的header然后指派所需的响应格式给客户端,不需要我们人工指定

'class' => 'yii\filters\ContentNegotiator',

'formats' => [

'application/json' => yii\web\Response::FORMAT_JSON,

'application/xml' => yii\web\Response::FORMAT_XML,

//api 端目前只需要json 和 xml

//还可以增加 yii\web\Response 类内置的响应格式,或者自己增加响应格式

],

]

],

10、配置文件中,components 配置 response,返回格式

'response' => [

'class' => 'yii\web\Response',

//设置 api 返回格式,错误码不在 header 里实现,而是放到 body里

'as resBeforeSend' => [

'class' => 'frontend\extensions\ResBeforeSendBehavior',

'defaultCode' => 500,

'defaultMsg' => 'error',

],

//ps:components 中绑定事件,可以用两种方法

//'on eventName' => $eventHandler,

//'as behaviorName' => $behaviorConfig,

//参考 http://www.yiiframework.com/doc-2.0/guide-concept-configurations.html#configuration-format

],

11、编写 frontend\extensions\ResBeforeSendBehavior 代码

namespace frontend\extensions;

use Yii;

use yii\web\Response;

use yii\base\Behavior;

class ResBeforeSendBehavior extends Behavior{

public $defaultCode = 500;

public $defaultMsg = 'error';

// 重载events() 使得在事件触发时,调用行为中的一些方法

public function events(){

// 在 EVENT_BEFORE_SEND 事件触发时,调用成员函数 beforeSend

return [

Response::EVENT_BEFORE_SEND => 'beforeSend',

];

}

// 注意 beforeSend 是行为的成员函数,而不是绑定的类的成员函数。

// 还要注意,这个函数的签名,要满足事件 handler 的要求。

public function beforeSend($event){

try {

$response = $event->sender;

if($response->data === null){

$response->data = [

'code'=> $this->defaultCode,

'msg'=> $this->defaultMsg,

];

} elseif(!$response->isSuccessful) {

$exception = Yii::$app->getErrorHandler()->exception;

if(is_object($exception) && !$exception instanceof yii\web\HttpException){

throw $exception;

} else {

$rData = $response->data;

$response->data = [

'code'=> empty($rData['status']) ? $this->defaultCode : $rData['status'],

'msg'=> empty($rData['message']) ? $this->defaultMsg : $rData['message'],

];

}

} else {

/**

* $response->isSuccessful 表示是否会抛出异常

* 值为 true, 代表返回数据正常,没有抛出异常

*/

$rData = $response->data;

$response->data = [

'code' => isset($rData['error_code']) ? $rData['error_code'] : 0,

'msg' => isset($rData['res_msg']) ? $rData['res_msg'] : $rData,

];

$response->statusCode = 200;

}

} catch (\Exception $e) {

$response->data = [

'code'=> $this->defaultCode,

'msg'=> $this->defaultMsg,

];

}

return true;

}

}

12、创建 GoodsController.php

namespace frontend\modules\v1\controllers;

use yii\rest\ActiveController;

class GoodsController extends ActiveController{

public $modelClass = 'common\models\Goods';

public function actionSearch(){

return [

'error_code'=> 20,

'res_msg'=> 'ok',

];

}

}

13、应用入口同级增加.htaccess文件,隐藏index.php,以apache为例

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule .* index.php

14、测试

命令:

curl -s -H Accept:application/xml http://local.rest.com/v1/goods/1

返回:

0

1

测试商品1

600

1

1520490595

1520490595

命令

curl -s -H Accept:application/json http://local.rest.com/v1/goods/1

返回

{

"code":0,

"msg":{

"id":"1",

"name":"测试商品1",

"price":"600",

"status":1,

"create_time":"1520490595",

"modify_time":"1520490595"

}

}

命令

curl -s -H Accept:application/json http://local.rest.com/v1/goods11

返回

{"code":404,"msg":"Page not found."}

命令

curl -s -H Accept:application/json http://local.rest.com/v1/goods/search

返回

{"code":20,"msg":"ok"}

15、参考

php restful yii,yii2 restful 风格搭建(一)相关推荐

  1. yii2 RESTful api的详细使用

    什么是RESTful风格的API 对于各种客户端设备与服务端的通信,我们往往都通过API为客户端提供数据,提供某种资源.关于RESTful的概念,一查一大推,一两句也解释不清,姑且先按照我们通俗的理解 ...

  2. Yii2 restful 分页支持

    大部分情况下,我们的数据是需要分页的.可是 Yii2 restful 默认情况下并不显示分页信息,我们不知道当前是哪一页,如何访问下一页,那么如何才能显示出分页数据呢?不要急,下面通过例子来说明. 1 ...

  3. php restful 认证,Yii2.0 RESTful API 认证教程

    认证介绍 和Web应用不同,RESTful APIs 通常是无状态的, 也就意味着不应使用 sessions 或 cookies, 因此每个请求应附带某种授权凭证,因为用户授权状态可能没通过 sess ...

  4. c# 调用restful json_SSM实现RESTFul风格的CURD操作

    面试题 1.使用final关键字修饰变量时,是引用不能变还是引用的对象不能变? 2.描述public ,private,protected,默认的区别? 3.Overload和Override的区别? ...

  5. php定义一个名为Vehicles,[PHP][Yii2.0] 以Yii 2.0风格加载自定义类或命名空间 [配置使用Yii2 autoloader]...

    Yii 2.0最显著的特征之一就是引入了命名空间,因此对于自定义类的引入方式也同之前有所不同.这篇文章讨论一下如何利用Yii 2.0的自动加载机制,向系统中引入自定义类和命名空间.本文旨在抛砖引玉,如 ...

  6. RESTful架构和RESTful API设计总结

    作者:智明书 链接:https://www.jianshu.com/p/955eb2faa354 REST这个词是2000年Roy Fielding在他的博士论文中提出的,Fielding参与了htt ...

  7. restful rest_HATEOAS的RESTful服务。 超媒体:REST的秘密要素

    restful rest 在这篇文章中,我们将介绍有关HATEOAS的RESTful服务的综合文章. 超媒体是REST的秘密成分. 1.简介 在本教程的前一部分中,我们花了一些时间来刷新有关REST体 ...

  8. restful rest_HATEOAS的RESTful服务。 REST:刷新器

    restful rest 在这篇文章中,我们将介绍有关HATEOAS的RESTful服务的综合文章. REST:刷新器. 1.简介 "不好了! 请,不要再发表有关REST的文章!" ...

  9. python django restful框架_Django RESTful API 实例带你快速上手开发

    1. Django 是什么 Django 是基于 Python 的一个 Web 开发框架,一般和 Flask Tornado 被称为 Python Web 三大框架,Django 是其中最成熟.稳定. ...

最新文章

  1. 判断一个对象是否存在某个键_面向工业大数据的对象存储技术实践
  2. 算法分析与设计-实验四 回溯算法设计
  3. 如何设置SSH访问的时间限制
  4. 幻影机器人庄园参观路线_市委老干部局机关党员干部一行赴机器人小镇参观考察...
  5. bigdecimal 保留两位小数_不要以为你用了BigDecimal后,计算结果就一定精确了
  6. 最新消息!Cloudera 全球发行版正式集成 Apache Flink
  7. Spring中的bean是否是线程安全的
  8. Java编写斗地主的游戏源码
  9. 拦截器和过滤器的执行顺序和区别
  10. Hashmap实现原理及hash冲突(碰撞)解决方法
  11. mapboxgl 互联网地图纠偏插件(一)
  12. 世界各国与中国时差查询
  13. libdmtx结合OpenCV识别DataMatrix二维码
  14. matlab最大回撤值,用matlab计算区间最大回撤值和最大回撤率
  15. HTML5 新增API学习总结
  16. XSS-labs通关游戏
  17. 传奇单机架设教程及游戏GM设置方法
  18. 游戏开发方案—《逃离禁闭岛》
  19. 子类不能继承或覆盖父类的private方法
  20. C#自动播放下一首歌曲(windowsmediaPlayer)

热门文章

  1. tornado环境搭建
  2. android上滑隐藏动画,ListView上滑和下滑,显示和隐藏Toolbar的实现方法
  3. CVPR 2022|重新思考对齐Prototype的域自适应:基于Graph Matching的新范式
  4. BP反向传播矩阵推导图示详解​
  5. 如何获取高精度CV模型?快来试试百度EasyDL超大规模视觉预训练模型
  6. 掌握AI核心技巧,一站式数据采集处理与智能识别公开课
  7. 岗位推荐 | 腾讯AI Lab多媒体算法组招聘正式员工和实习生
  8. HttpClient在传参和返回结果的中文乱码问题
  9. 计算机IO系列「零」计算机IO【硬件部分】
  10. spring boot+logbak项目打成jar包使用java -jar命令启动后日志出现中文乱码