Yii2.0 RESTful API快速搭建教程

Yii2 RESTful API 實戰教程

這篇說下yii2.0開發 API 吧,使用 RESTful API模式php

安裝Yii2.0

經過 Composer 安裝

這是安裝Yii2.0的首選方法。若是你尚未安裝 Composer,你能夠按照這裏的說明進行安裝。前端

安裝完 Composer,運行下面的命令來安裝 Composer Asset 插件:mysql

php composer.phar global require "fxp/composer-asset-plugin:^1.2.0"

安裝高級的應用程序模板,運行下面的命令:git

php composer.phar create-project yiisoft/yii2-app-advanced advanced 2.0.13

初始化高級模板

cd advanced
init

修改數據庫鏈接屬性

打開 common\config\main-local.php,配置數據庫鏈接信息github

'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=127.0.0.1;dbname=yiiapi',
            'username' => 'root',
            'password' => 'root',
            'charset' => 'utf8',
        ],

執行 migrate 數據庫遷移

yii migrate

拷貝backend目錄,命名爲api

打開api\config\main.php 修改id,controllerNamespaceweb

return [
    'id' => 'app-api',
    'basePath' => dirname(__DIR__),
    'controllerNamespace' => 'api\controllers',
]

打開common\config\main.php開啓url路由美化規則sql

'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
            ],
        ],

打開common\config\bootstrap.php添加如下別名數據庫

Yii::setAlias('@api', dirname(dirname(__DIR__)) . '/api');

爲何要單首創建API應用

單首創建API應用,目的是便於維護,能夠避免如下問題json

  • 配置的衝突
  • 控制器的命名不便
  • url美化規則衝突
  • 分工明確frontend爲前臺目錄;backend爲後臺目錄;api爲api目錄

接下來打開 api\controllers 新建一個User控制器,繼承 yii\rest\ActiveController,命名爲 UserController,代碼以下:bootstrap

<?php
namespace api\controllers;
use yii\rest\ActiveController;

class UserController extend extends ActiveController
{
    public $modelClass = 'common\models\User';
    
}

這裏建立 user控制器繼承 yii\rest\ActiveController 並指定要操做的模型

啓用JSON 輸入

配置 request 應用程序組件的 parsers 屬性使用 yii\web\JsonParser 用於 JSON 輸入

打開配置文件 api\config\main-local.php 修改成以下代碼:

<?php

$config = [
    'components' => [
        'request' => [
            // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
            'cookieValidationKey' => 'P0r2XoT9LCUnyVlSgxBbJOqQxdCJ3i29',
            'parsers' => [
                'application/json' => 'yii\web\JsonParser',

            ],
        ],
    ],
];

if (!YII_ENV_TEST) {
    // configuration adjustments for 'dev' environment
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = [
        'class' => 'yii\debug\Module',
    ];

    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',
    ];
}

return $config;

配置URL規則

爲剛纔的 user控制器添加url美化規則

打開 api\config\main.php 修改 components屬性,添加下列代碼:

...
'urlManager' => [
    'enablePrettyUrl' => true,
    'enableStrictParsing' => true,
    'showScriptName' => false,
    'rules' => [
        ['class' => 'yii\rest\UrlRule', 
        'controller' => 'user'
        ],
    ],
]

...

ok,到此就成了一個 符合 RESTful 風格的API
看起來在控制器了什麼也沒有寫,只是指定了一個模型,可是她的背後完成了不少的功能哦,列表以下:

  • GET /users: 逐頁列出全部用戶
  • HEAD /users: 顯示用戶列表的概要信息
  • POST /users: 建立一個新用戶
  • GET /users/123: 返回用戶 123 的詳細信息
  • HEAD /users/123: 顯示用戶 123 的概述信息
  • PATCH /users/123: and PUT /users/123: 更新用戶123
  • DELETE /users/123: 刪除用戶123
  • OPTIONS /users: 顯示關於末端 /users 支持的動詞
  • OPTIONS /users/123: 顯示有關末端 /users/123 支持的動詞

如何訪問呢

你可使用 curl命令進行訪問,命令以下:

curl -i -H "Accept:application/json" "http://localhost/users"

命令行下仍是比較麻煩的,也不方便測試,推薦使用 API測試工具

這類的工具備不少,我就不一一列舉了,這裏推薦 Postman,很好很強大,Chorme也有插件,能夠安裝,這裏我推薦直接下載軟件安裝調試,比較方便

你可能發現了 訪問任何路由地址都是加的s,users , 爲何呢? 資源,你要理解 資源二字,既然是資源確定是個集合,確定有一大堆,因此要加上覆數,我是這麼理解的。

你說我就是不想加上s,我就想採用http://localhost/user 這種方式來進行訪問,好吧,能夠,知足你,只是不推薦

繼續打開配置文件api\config\main.php修改剛纔添加的 urlManager 以下:

'urlManager' => [
    'enablePrettyUrl' => true,
    'enableStrictParsing' => true,
    'showScriptName' => false,
    'rules' => [
        ['class' => 'yii\rest\UrlRule', 
        'controller' => 'user',
        'pluralize' => false,    //設置爲false 就能夠去掉複數形式了
        ],
    ],
]

加入 'pluralize' => false, 就表示去掉複數形式了,再次強調不推薦

ok,在控制器中咱們沒有寫任何一句代碼,他就給咱們生成許多方法,可是有時候咱們可能須要修改一些代碼,來達到咱們想要的效果,好比連表查詢,而後再返回數據

接下來咱們就實現這樣的功能:

打開剛纔新建的user控制器, 重寫 action方法:

<?php

namespace api\controllers;
use yii\rest\ActiveController;

class UserController extend extends ActiveController
{
    public $modelClass = 'common\models\User';
    
    public function actions()
    {
        $action= parent::actions(); // TODO: Change the autogenerated stub
        unset($action['index']);
        unset($action['create']);
        unset($action['update']);
        unset($action['delete']);
    }
    
    public function actionIndex()
    {
        //你的代碼
    }
    
}

這樣咱們就能夠重寫他的代碼了。哈哈

咱們再新建一個本身的 action

<?php

namespace api\controllers;
use yii\rest\ActiveController;

class UserController extend extends ActiveController
{
    public $modelClass = 'common\models\User';
    
    public function actions()
    {
        $action= parent::actions(); // TODO: Change the autogenerated stub
        unset($action['index']);
        unset($action['create']);
        unset($action['update']);
        unset($action['delete']);
    }
    
    public function actionIndex()
    {
        //你的代碼
    }
    
    public function actionSendEmail()  //假如是get請求
    {
        //業務邏輯
    }
    
}

而後試着訪問一下 http://localhost/users/send-email,報錯?找不到?

報錯就對了,那是由於咱們沒有設置其餘路由訪問

修改 api\config\main.php

'urlManager' => [
    'enablePrettyUrl' => true,
    'enableStrictParsing' => true,
    'showScriptName' => false,
    'rules' => [
        ['class' => 'yii\rest\UrlRule', 
        'controller' => 'user',
        //'pluralize' => false,    //設置爲false 就能夠去掉複數形式了
        'extraPatterns'=>[
            'GET send-email'=>'send-email'
        ],
        ],
    ],
]

接下來從新訪問就沒有問題了,ps:你本身編寫的任何 action 都要在 extraPatterns 進行配置

差點忘了 狀態碼 這個東西,咱們如今全部的東西返回來的都是一個 JSON,加入沒有數據局返回的是空的數組,因此這確定不行啊,咱們得加上 一些特定的狀態碼 來標識這些數據啊,怎麼加?

繼續修改 api\config\main.phpcomponents 添加以下代碼:

'response' => [
            'class' => 'yii\web\Response',
            'on beforeSend' => function ($event) {
                $response = $event->sender;
                $response->data = [
                    'success' => $response->isSuccessful,
                    'code' => $response->getStatusCode(),
                    'message' => $response->statusText,
                    'data' => $response->data,
                ];
                $response->statusCode = 200;
            },
        ],

這裏統一使用 200來表示,固然並非全部的都是 200,你應該具體狀況具體對待,切記不要亂使用 任意加各類標識,有時候你可能須要和一些前端講道理了 因此請讓他們務必 遵循這些 規範 狀態碼

是否是以爲還少了點什麼?認證 對就是 認證,就差 認證 就完美了,篇幅有限,內容多了反而影響閱讀興趣,下篇進行 認證介紹

感謝如下,特別是 魏曦老師的視頻教程

魏曦教你學

Yii Framework 2.0 權威指南

不足之處,歡迎指正

 
 
G
M
T
 
 
Detect languageAfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBengaliBosnianBulgarianCatalanCebuanoChichewaChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDutchEnglishEsperantoEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekGujaratiHaitian CreoleHausaHebrewHindiHmongHungarianIcelandicIgboIndonesianIrishItalianJapaneseJavaneseKannadaKazakhKhmerKoreanLaoLatinLatvianLithuanianMacedonianMalagasyMalayMalayalamMalteseMaoriMarathiMongolianMyanmar (Burmese)NepaliNorwegianPersianPolishPortuguesePunjabiRomanianRussianSerbianSesothoSinhalaSlovakSlovenianSomaliSpanishSundaneseSwahiliSwedishTajikTamilTeluguThaiTurkishUkrainianUrduUzbekVietnameseWelshYiddishYorubaZulu
 
AfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBengaliBosnianBulgarianCatalanCebuanoChichewaChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDutchEnglishEsperantoEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekGujaratiHaitian CreoleHausaHebrewHindiHmongHungarianIcelandicIgboIndonesianIrishItalianJapaneseJavaneseKannadaKazakhKhmerKoreanLaoLatinLatvianLithuanianMacedonianMalagasyMalayMalayalamMalteseMaoriMarathiMongolianMyanmar (Burmese)NepaliNorwegianPersianPolishPortuguesePunjabiRomanianRussianSerbianSesothoSinhalaSlovakSlovenianSomaliSpanishSundaneseSwahiliSwedishTajikTamilTeluguThaiTurkishUkrainianUrduUzbekVietnameseWelshYiddishYorubaZulu
 
 
 
 
 
 
 
 
 
Text-to-speech function is limited to 200 characters
 
 
Options : History : Feedback : Donate Close
相關文章
相關標籤/搜索