yii restful api

Posted iceman!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了yii restful api相关的知识,希望对你有一定的参考价值。

一、创建数据库

首先,在mysql中创建一个名为yii2basic的数据库,并创建一张名为player的表。

二、配置

1.app/config/db.php

 
  1. <?php  
  2.   
  3. return [  
  4.     ‘class‘ => ‘yii\db\Connection‘,  
  5.     ‘dsn‘ => ‘mysql:host=localhost;dbname=yii2basic‘,  
  6.     ‘username‘ => ‘root‘,  
  7.     ‘password‘ => ‘‘,  
  8.     ‘charset‘ => ‘utf8‘,  
  9. ];  
将此处的用户名和密码更改为本地对应。
 
2.app/config/web.php

 
  1. ‘urlManager‘ => [  
  2.     ‘enablePrettyUrl‘ => true,  
  3.     ‘enableStrictParsing‘ => true,  
  4.     ‘showScriptName‘ => false,  
  5.     ‘rules‘ => [  
  6.         [‘class‘ => ‘yii\rest\UrlRule‘, ‘controller‘ => ‘player‘],  
  7.     ],  
  8. ],  
在components下添加url配置。

3.创建.htaccess
 
在Yii项目下创建.htaccess,在app/web下创建,其内容为:

 
  1. Options +FollowSymLinks  
  2. IndexIgnore /  
  3. RewriteEngine on  
  4. RewriteCond %{REQUEST_FILENAME} !-f  
  5. RewriteCond %{REQUEST_FILENAME} !-d  
  6. RewriteRule . index.php  

三、创建一个控制器 

首先,创建一个控制器类 app\controllers\PlayerController 如下,

 


  1. namespace app\controllers;  
  2.   
  3. use yii\rest\ActiveController;  
  4.   
  5. class UserController extends ActiveController  
  6. {  
  7.     public $modelClass = ‘app\models\Player‘;  
  8.     public $serializer = ‘yii\rest\Serializer‘;  
  9.     public function checkAccess()  
  10.     {  
  11.     }  
  12. }  

 

控制器类扩展自 yii\rest\ActiveController。通过指定 yii\rest\ActiveController::modelClass 作为 app\models\player, 控制器就能知道使用哪个模型去获取和处理数据。

 

四、创建一个模型类

然后,创建一个模型类 app\model\Player 如下,

 

 


 
  1. <?php  
  2.   
  3. namespace app\models;  
  4.   
  5.   
  6. use yii\db\ActiveRecord;  
  7. use yii\web\Link;  
  8. use yii\web\Linkable;  
  9. use yii\helpers\Url;  
  10.   
  11.   
  12. class Player extends ActiveRecord implements Linkable  
  13. {  
  14.     public function fields()  
  15.     {  
  16.         return [  
  17.             // 字段名和属性名相同  
  18.             ‘id‘,  
  19.             // 字段名为"email", 对应的属性名为"email_address"  
  20.             ‘username‘,  
  21.               
  22.             ‘password‘,  
  23.         ];  
  24.     }  
  25.   
  26.   
  27.     public function getLinks()  
  28.     {  
  29.         return [  
  30.             Link::REL_SELF => Url::to([‘user/view‘, ‘id‘ => $this->id], true),  
  31.         ];  
  32.     }  
  33. }  

 

到此根据官方文档可知已经生成了对应的一系列API,格式参照Yii2.0 RESTful Web服务(1)
通过命令:

 
  1. curl -i -H "Accept:application/json" "http://localhost/YourAppName/web/players"  
会接收到如下的信息:

 
  1. [  
  2.   {  
  3.     "id": 0,  
  4.     "username": "",  
  5.     "password": "",  
  6.     "_links": {  
  7.       "self": {  
  8.         "href": "http://localhost/first-Yii/web/player/view?id=0"  
  9.       }  
  10.     }  
  11.   },  
  12.   {  
  13.     "id": 1,  
  14.     "username": "dffdfdfd",  
  15.     "password": "sdsadsa",  
  16.     "_links": {  
  17.       "self": {  
  18.         "href": "http://localhost/first-Yii/web/player/view?id=1<span style="font-family: ‘Helvetica Neue‘, Helvetica, Arial, ‘Hiragino Sans GB‘, ‘Hiragino Sans GB W3‘, ‘WenQuanYi Micro Hei‘, ‘Microsoft YaHei UI‘, ‘Microsoft YaHei‘, sans-serif; white-space: pre-wrap;">"</span>  
  19.       }  
  20.     }  
  21.   }  
  22. ]  

使用Postman对功能进行测试发现,CURD操作中的CD操作行为正常,但是请求单条记录的操作的则会返回如下的错误:

 
  1. {  
  2.   "name": "Exception",  
  3.   "message": "Calling unknown method: app\\models\\Player::serializeModel()",  
  4.   "code": 0,  
  5.   "type": "yii\\base\\UnknownMethodException",  
  6.   "file": "/Applications/XAMPP/xamppfiles/htdocs/first-Yii/vendor/yiisoft/yii2/base/Component.php",  
  7.   "line": 285,  
  8.   "stack-trace": [  
  9.     "#0 /Applications/XAMPP/xamppfiles/htdocs/first-Yii/vendor/yiisoft/yii2/rest/Serializer.php(137): yii\\base\\Component->__call(‘serializeModel‘, Array)",  
  10.     "#1 /Applications/XAMPP/xamppfiles/htdocs/first-Yii/vendor/yiisoft/yii2/rest/Serializer.php(137): app\\models\\Player->serializeModel()",  
  11.     "#2 /Applications/XAMPP/xamppfiles/htdocs/first-Yii/vendor/yiisoft/yii2/rest/Controller.php(97): yii\\rest\\Serializer->serialize(Object(app\\models\\Player))",  
  12.     "#3 /Applications/XAMPP/xamppfiles/htdocs/first-Yii/vendor/yiisoft/yii2/rest/Controller.php(75): yii\\rest\\Controller->serializeData(Object(app\\models\\Player))",  
  13.     "#4 /Applications/XAMPP/xamppfiles/htdocs/first-Yii/vendor/yiisoft/yii2/base/Controller.php(156): yii\\rest\\Controller->afterAction(Object(yii\\rest\\ViewAction), Object(app\\models\\Player))",  
  14.     "#5 /Applications/XAMPP/xamppfiles/htdocs/first-Yii/vendor/yiisoft/yii2/base/Module.php(454): yii\\base\\Controller->runAction(‘view‘, Array)",  
  15.     "#6 /Applications/XAMPP/xamppfiles/htdocs/first-Yii/vendor/yiisoft/yii2/web/Application.php(84): yii\\base\\Module->runAction(‘player/view‘, Array)",  
  16.     "#7 /Applications/XAMPP/xamppfiles/htdocs/first-Yii/vendor/yiisoft/yii2/base/Application.php(375): yii\\web\\Application->handleRequest(Object(yii\\web\\Request))",  
  17.     "#8 /Applications/XAMPP/xamppfiles/htdocs/first-Yii/web/index.php(12): yii\\base\\Application->run()",  
  18.     "#9 {main}"  
  19.   ]  
  20. }  
报错提示调用了不存在的方法,由Yii2.0 初识 RESTful Serializer可知此处是一个对模型序列化的方法,返回到Controller的声明中可以发现确实初始化了$serializer变量。可以看出:

 
  1. public function serialize($data)  
  2. {  
  3.     if ($data instanceof Model && $data->serializeModel()) {  
  4.         return $this->serializeModelErrors($data);  
  5.     } elseif ($data instanceof Arrayable) {  
  6.         return $this->serializeModel($data);  
  7.     } elseif ($data instanceof DataProviderInterface) {  
  8.         return $this->serializeDataProvider($data);  
  9.     } else {  
  10.         return $data;  
  11.     }  
  12. }  
应当是此处传入的$data并没有serializeModel()方法,查找serializeModel()的定义,发现app/rest/Serializer::serializeModel();在此处有一个定义,可见传入的数据并不一定会有serializeModel方法,除非传入的数据已经是一个app/rest/Serializer的实例,那么注释掉$data->serializeModel()这个条件,进行测试,这次并没有报错,但是返回了一个空的结果集。
-------------------------------------------第一次更新----------------------------------------
这次我对数据库中没有的记录进行了查询,这次返回的结果给了很大的提示:

 
  1. {  
  2.   "name": "Not Found",  
  3.   "message": "Object not found: 3",  
  4.   "code": 0,  
  5.   "status": 404,  
  6.   "type": "yii\\web\\NotFoundHttpException"  
  7. }  
确实数据库中并没有主键为3的这条记录,所以在数据库更换主键再进行测试,这次以username作为主键发现问题依然存在。














以上是关于yii restful api的主要内容,如果未能解决你的问题,请参考以下文章

Yii restful api跨域

使用令牌实现 RESTful API 身份验证 (Yii/Yii2)

yii2 RESTful api的详细使用

Yii2框架RESTful API教程 - 快速入门

Yii2 使用 RESTful 写API接口 实例

Yii2:REST API - 404 错误