• yii restful api


    一、创建数据库

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

    二、配置

    1.app/config/db.php

     
    1. <?php  
    2.   
    3. return [  
    4.     'class' => 'yiidbConnection',  
    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 estUrlRule', '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  

    三、创建一个控制器 

    首先,创建一个控制器类 appcontrollersPlayerController 如下,


    1. namespace appcontrollers;  
    2.   
    3. use yii estActiveController;  
    4.   
    5. class UserController extends ActiveController  
    6. {  
    7.     public $modelClass = 'appmodelsPlayer';  
    8.     public $serializer = 'yii estSerializer';  
    9.     public function checkAccess()  
    10.     {  
    11.     }  
    12. }  

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

    四、创建一个模型类

    然后,创建一个模型类 appmodelPlayer 如下,


     
    1. <?php  
    2.   
    3. namespace appmodels;  
    4.   
    5.   
    6. use yiidbActiveRecord;  
    7. use yiiwebLink;  
    8. use yiiwebLinkable;  
    9. use yiihelpersUrl;  
    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作为主键发现问题依然存在。
  • 相关阅读:
    android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 3
    display:inline-block的运用
    图解单片机8位PWM、16位PWM中“位”的含义!
    UVA10006
    [置顶] CF 86D Powerful array 分块算法入门,n*sqrt(n)
    俗人解释 三维渲染 在工作过程
    HDU 4414 Finding crosses(dfs)
    Codeforces 35E Parade 扫描线 + list
    hdu 4374 单调队列
    LeetCode OJ平台Sort Colors讨论主题算法
  • 原文地址:https://www.cnblogs.com/iceman-/p/8331576.html
Copyright © 2020-2023  润新知