亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁 php框架 YII yii2寫api接口步驟

yii2寫api接口步驟

Nov 06, 2019 pm 05:32 PM
yii2

yii2寫api接口步驟

yii2寫api接口步驟

Yii2如何實(shí)現(xiàn)RESTful風(fēng)格的API(推薦:《YII教程》?)

1、建立單獨(dú)的應(yīng)用程序

為了增加程序的可維護(hù)性,易操作性,我們選擇新建一套應(yīng)用程序,這也是為了和前臺(tái)應(yīng)用、后臺(tái)應(yīng)用區(qū)分開操作。

在WEB前端(frontend)和后端(backend)的同級(jí)目錄,新建一個(gè)文件夾,命名api,其目錄結(jié)構(gòu)如下所示:

├─assets
│      AppAsset.php
├─config
│      bootstrap.php
│      main-local.php
│      main.php
│      params-local.php
│      params.php
├─runtime
└─web
    │ index.php
    ├─assets
    └─css

可以看出其目錄結(jié)構(gòu)基本上同backend沒有其他差異,因?yàn)槲覀兙褪强截恇ackend項(xiàng)目,只是做了部分優(yōu)化。

友情提醒,該步驟完成以后,需要修改common\config\bootstrap.php文件,對(duì)新建的應(yīng)用增加alias別名

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

2、為新建的api應(yīng)用程序美化路由

首先保證你的web服務(wù)器開啟rewrite規(guī)則,細(xì)節(jié)我們就不說了,不過這是前提。

接著配置api/config/main.php文件

'components' => [
    // other config
    'urlManager' => [
        'enablePrettyUrl' => true,
        'showScriptName' => false,
        'enableStrictParsing' =>true,
        'rules' => [],
    ]
],

開啟nginx的rewrite,注意在你的配置文件中加入紅色的文字:

server {
    charset utf-8;
    client_max_body_size 128M;

    listen 80; ## listen for ipv4
    #listen [::]:80 default_server ipv6only=on; ## listen for ipv6

    server_name mysite.local;
    root        /path/to/basic/web;
    index       index.php;

    access_log  /path/to/basic/log/access.log;
    error_log   /path/to/basic/log/error.log;

    location / {
        # Redirect everything that isn't a real file to index.php
        try_files $uri $uri/ /index.php$is_args$args;
    }

    # uncomment to avoid processing of calls to non-existing static files by Yii
    #location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
    #    try_files $uri =404;
    #}
    #error_page 404 /404.html;

    # deny accessing php files for the /assets directory
    location ~ ^/assets/.*\.php$ {
        deny all;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass 127.0.0.1:9000;
        #fastcgi_pass unix:/var/run/php5-fpm.sock;
        try_files $uri =404;
    }

    location ~* /\. {
        deny all;
    }
}

最后只需要在應(yīng)用入口同級(jí)增加.htaccess文件就好,我們以nginx為例

# use mod_rewrite for pretty URL support
RewriteEngine on
# if a directory or a file exists, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# otherwise forward the request to index.php
RewriteRule . index.php

3、利用gii生成測試modules

用了便于演示說明,我們新建一張數(shù)據(jù)表goods表,并向其中插入幾條數(shù)據(jù)。

CREATE TABLE `goods` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `goods` VALUES ('1', '11111');
INSERT INTO `goods` VALUES ('2', '22222');
INSERT INTO `goods` VALUES ('3', '333');
INSERT INTO `goods` VALUES ('4', '444');
INSERT INTO `goods` VALUES ('5', '555');

接著我們先利用gii生成modules后,再利用gii模塊,按照下圖中生成goods信息

1.jpg

2.jpg

3.jpg

現(xiàn)在,我們的api目錄結(jié)構(gòu)應(yīng)該多個(gè)下面這幾個(gè)目錄

│
├─models
│      Goods.php
│
├─modules
│  └─v1
│      │  Module.php
│      │
│      ├─controllers
│      │      DefaultController.php
│      │      GoodsController.php
│      │
│      └─views
│          └─default
│                  index.php

需要說明的是:在生成modules的步驟中,為了使我們的模塊可以訪問,不要忘記在main.php配置文件中添加下面的代碼

<?php    
    ......
    &#39;modules&#39; => [
        &#39;v1&#39; => [
            &#39;class&#39; => &#39;api\modules\v1\Module&#39;,
        ],
    ],
    ......

4、重新配置控制器

為了實(shí)現(xiàn)restful風(fēng)格的api,在yii2中,我們需要對(duì)控制器進(jìn)行一下改寫

<?php
namespace api\modules\v1\controllers;
use yii\rest\ActiveController;
class GoodsController extends ActiveController
{
    public $modelClass = &#39;api\models\Goods&#39;;
}

5、為Goods配置Url規(guī)則

&#39;rules&#39; => [
    [
        &#39;class&#39; => &#39;yii\rest\UrlRule&#39;,
        &#39;controller&#39; => [&#39;v1/goods&#39;]
    ],
]

6、模擬請(qǐng)求操作

經(jīng)過上面幾個(gè)步驟,到此我們已經(jīng)為goods成功創(chuàng)建了滿足restful風(fēng)格的api了。為了更好更方便的演示,我們借助工具postman進(jìn)行模擬請(qǐng)求。

為了見證一下我們的操作,我們用postman請(qǐng)求一下GET /v1/goods看看結(jié)果如何:

接著我們先利用gii生成modules后,再利用gii模塊,按照下圖中生成goods信息

4.jpg

現(xiàn)在,我們的api目錄結(jié)構(gòu)應(yīng)該多個(gè)下面這幾個(gè)目錄

從上面截圖中可以清楚的看到,GET /v1/goods 已經(jīng)能夠很方便的獲取我們表中的數(shù)據(jù)了。

當(dāng)然,yii2還對(duì)該api封裝了如下操作:

GET /users: 逐頁列出所有用戶
HEAD /users: 顯示用戶列表的概要信息
POST /users: 創(chuàng)建一個(gè)新用戶
GET /users/123: 返回用戶 123 的詳細(xì)信息
HEAD /users/123: 顯示用戶 123 的概述信息
PATCH /users/123 and PUT /users/123: 更新用戶123
DELETE /users/123: 刪除用戶123
OPTIONS /users: 顯示關(guān)于末端 /users 支持的動(dòng)詞
OPTIONS /users/123: 顯示有關(guān)末端 /users/123 支持的動(dòng)詞

不信的話我們可以利用postman發(fā)送一個(gè)post請(qǐng)求到/v1/goods,我們會(huì)發(fā)現(xiàn)成功創(chuàng)建了一個(gè)新的商品。

需要提醒的是,操作中還請(qǐng)細(xì)心且注意:如果你的控制器末端不是復(fù)數(shù)(比如是blog非blogs)請(qǐng)保證請(qǐng)求的時(shí)候是復(fù)數(shù)!這是因?yàn)樵赗ESTful架構(gòu)中,網(wǎng)址中只能有名詞而不能包含動(dòng)詞,名詞又往往與數(shù)據(jù)表相對(duì)應(yīng),數(shù)據(jù)表呢又是一個(gè)“集合”,因此該名詞往往是復(fù)數(shù)的形式。

7、關(guān)于授權(quán)認(rèn)證

為什么需要授權(quán)認(rèn)證?這在一般的操作中是需要的。比如說用戶要設(shè)置自己的信息。

為了對(duì)yii2 restful授權(quán)認(rèn)證說的更清楚,我們將會(huì)以兩個(gè)兩種不同的方法進(jìn)行說明。

首先需要開啟認(rèn)證:

假設(shè)我們已經(jīng)按照第3步創(chuàng)建了包含字段access-token的數(shù)據(jù)表user,而且利用gii上生成了相應(yīng)的model和controller

配置main.php文件

&#39;components&#39; => [
    &#39;user&#39; => [ 
        &#39;identityClass&#39; => &#39;common\models\User&#39;,
        &#39;enableAutoLogin&#39; => true,
        &#39;enableSession&#39;=>false
    ],
],

為控制器配置authenticator行為指定認(rèn)證方式

<?php
namespace api\modules\v1\controllers;
use yii\rest\ActiveController;
use yii\helpers\ArrayHelper;
use yii\filters\auth\QueryParamAuth;
class UserController extends ActiveController
{
    public $modelClass = &#39;api\models\User&#39;;
    public function behaviors() {
        return ArrayHelper::merge (parent::behaviors(), [ 
                &#39;authenticator&#39; => [ 
                    &#39;class&#39; => QueryParamAuth::className() 
                ] 
        ] );
    }
}

最后我們還需要在identityClass中實(shí)現(xiàn)findIdentityByAccessToken方法

public static function findIdentityByAccessToken($token, $type = null)
{
    return static::findOne([&#39;access_token&#39; => $token, &#39;status&#39; => self::STATUS_ACTIVE]);
}

如此一來,我們先通過postman模擬不帶access-token請(qǐng)求看結(jié)果

{
  "name": "Unauthorized",
  "message": "You are requesting with an invalid credential.",
  "code": 0,
  "status": 401,
  "type": "yii\\web\\UnauthorizedHttpException"
}

提示401 我們沒有權(quán)限訪問!

我們?cè)谡?qǐng)求的鏈接上攜帶正確的access-token,認(rèn)證通過后,控制器會(huì)再繼續(xù)執(zhí)行其他檢查(頻率限制、操作權(quán)限等),才可以返回正確的用戶信息。

需要提醒的是:通過url的形式對(duì)access-token傳遞存在一定的風(fēng)險(xiǎn),有可能會(huì)造成數(shù)據(jù)的泄漏!一般而言,access-token需要放到HTTP頭中進(jìn)行傳遞!除非客戶端的請(qǐng)求是jsonp格式的!

關(guān)于授權(quán)認(rèn)證,我們有一篇更詳細(xì)的文章,包括一套完整案例、服務(wù)端返回的數(shù)據(jù)類型定義、自定義錯(cuò)誤機(jī)制等。

8、速率限制

速率限制,該操作完全也是出于安全考慮,我們需要限制同一接口某時(shí)間段過多的請(qǐng)求。

速率限制默認(rèn)不啟用,用啟用速率限制,yii\web\User::identityClass 應(yīng)該實(shí)現(xiàn)yii\filters\RateLimitInterface,也就是說我們的common\models\User.php需要實(shí)現(xiàn)yii\filters\RateLimitInterface接口的三個(gè)方法,具體代碼可參考:

use yii\filters\RateLimitInterface;
use yii\web\IdentityInterface;
class User extends ActiveRecord implements IdentityInterface, RateLimitInterface
{
    // other code ...... 
    // 返回某一時(shí)間允許請(qǐng)求的最大數(shù)量,比如設(shè)置10秒內(nèi)最多5次請(qǐng)求(小數(shù)量方便我們模擬測試)
    public  function getRateLimit($request, $action){  
         return [5, 10];  
    }
     
    // 回剩余的允許的請(qǐng)求和相應(yīng)的UNIX時(shí)間戳數(shù) 當(dāng)最后一次速率限制檢查時(shí)
    public  function loadAllowance($request, $action){  
         return [$this->allowance, $this->allowance_updated_at];  
    }  
     
    // 保存允許剩余的請(qǐng)求數(shù)和當(dāng)前的UNIX時(shí)間戳
    public  function saveAllowance($request, $action, $allowance, $timestamp){ 
        $this->allowance = $allowance;  
        $this->allowance_updated_at = $timestamp;  
        $this->save();  
    }  
}

需要注意的是,你仍然需要在數(shù)據(jù)表User中新增加兩個(gè)字段

allowance:剩余的允許的請(qǐng)求數(shù)量

allowance_updated_at:相應(yīng)的UNIX時(shí)間戳數(shù)

在我們啟用了速率限制后,Yii 會(huì)自動(dòng)使用 yii\filters\RateLimiter 為 yii\rest\Controller 配置一個(gè)行為過濾器來執(zhí)行速率限制檢查。

現(xiàn)在我們通過postman請(qǐng)求v1/users再看看結(jié)果,會(huì)發(fā)現(xiàn)在10秒內(nèi)調(diào)用超過5次API接口,我們會(huì)得到狀態(tài)為429太多請(qǐng)求的異常信息。

{
  "name": "Too Many Requests",
  "message": "Rate limit exceeded.",
  "code": 0,
  "status": 429,
  "type": "yii\\web\\TooManyRequestsHttpException"
}

9、關(guān)于版本

為了兼容歷史版本而且考慮向后兼容性,我們?cè)谝婚_始操作的時(shí)候就以URL的方式實(shí)現(xiàn)了版本話,這里就不再進(jìn)行闡述了。

10、錯(cuò)誤處理

Yii的REST框架的HTTP狀態(tài)代碼可參考如下就好,沒啥好說的

200: OK。一切正常。

201: 響應(yīng) POST 請(qǐng)求時(shí)成功創(chuàng)建一個(gè)資源。Location header 包含的URL指向新創(chuàng)建的資源。

204: 該請(qǐng)求被成功處理,響應(yīng)不包含正文內(nèi)容 (類似 DELETE 請(qǐng)求)。

304: 資源沒有被修改??梢允褂镁彺娴陌姹尽?/p>

400: 錯(cuò)誤的請(qǐng)求。可能通過用戶方面的多種原因引起的,例如在請(qǐng)求體內(nèi)有無效的JSON 數(shù)據(jù),無效的操作參數(shù),等等。

401: 驗(yàn)證失敗。

403: 已經(jīng)經(jīng)過身份驗(yàn)證的用戶不允許訪問指定的 API 末端。

404: 所請(qǐng)求的資源不存在。

405: 不被允許的方法。 請(qǐng)檢查 Allow header 允許的HTTP方法。

415: 不支持的媒體類型。 所請(qǐng)求的內(nèi)容類型或版本號(hào)是無效的。

422: 數(shù)據(jù)驗(yàn)證失敗 (例如,響應(yīng)一個(gè) POST 請(qǐng)求)。 請(qǐng)檢查響應(yīng)體內(nèi)詳細(xì)的錯(cuò)誤消息。

429: 請(qǐng)求過多。 由于限速請(qǐng)求被拒絕。

500: 內(nèi)部服務(wù)器錯(cuò)誤。 這可能是由于內(nèi)部程序錯(cuò)誤引起的。

以上是yii2寫api接口步驟的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

Laravel MVC:真實(shí)代碼樣本 Laravel MVC:真實(shí)代碼樣本 Jul 03, 2025 am 12:35 AM

Laravel的MVC架構(gòu)由模型、視圖和控制器組成,分別負(fù)責(zé)數(shù)據(jù)邏輯、用戶界面和請(qǐng)求處理。1)創(chuàng)建User模型定義數(shù)據(jù)結(jié)構(gòu)和關(guān)系。2)UserController處理用戶請(qǐng)求,包括列出、顯示和創(chuàng)建用戶。3)視圖使用Blade模板展示用戶數(shù)據(jù)。該架構(gòu)提升了代碼的清晰度和可維護(hù)性。

什么是YII資產(chǎn)包,它們的目的是什么? 什么是YII資產(chǎn)包,它們的目的是什么? Jul 07, 2025 am 12:06 AM

YiiassetbundlesorganizeandmanagewebassetslikeCSS,JavaScript,andimagesinaYiiapplication.1.Theysimplifydependencymanagement,ensuringcorrectloadorder.2.Theypreventduplicateassetinclusion.3.Theyenableenvironment-specifichandlingsuchasminification.4.Theyp

如何從控制器中呈現(xiàn)視圖? 如何從控制器中呈現(xiàn)視圖? Jul 07, 2025 am 12:09 AM

在MVC框架中控制器渲染視圖的機(jī)制基于命名約定并允許顯式覆蓋,若未明確指示重定向,則控制器會(huì)自動(dòng)尋找與動(dòng)作同名的視圖文件進(jìn)行渲染。1.確保視圖文件存在且命名正確,如控制器PostsController的動(dòng)作show對(duì)應(yīng)的視圖路徑應(yīng)為views/posts/show.html.erb或Views/Posts/Show.cshtml;2.使用顯式渲染可指定不同模板,如Rails中render'custom_template'、Laravel中view('posts.custom_template')

如何使用YII模型將數(shù)據(jù)保存到數(shù)據(jù)庫? 如何使用YII模型將數(shù)據(jù)保存到數(shù)據(jù)庫? Jul 05, 2025 am 12:36 AM

在Yii框架中保存數(shù)據(jù)到數(shù)據(jù)庫時(shí),主要通過ActiveRecord模型實(shí)現(xiàn)。1.創(chuàng)建新記錄需實(shí)例化模型、加載數(shù)據(jù)并驗(yàn)證后保存;2.更新記錄需先查詢已有數(shù)據(jù)再賦值保存;3.使用load()方法進(jìn)行批量賦值時(shí)需在rules()中標(biāo)記安全屬性;4.保存關(guān)聯(lián)數(shù)據(jù)時(shí)應(yīng)使用事務(wù)確保一致性。具體步驟包括:實(shí)例化模型后用load()填充數(shù)據(jù),調(diào)用validate()驗(yàn)證,最后執(zhí)行save()持久化;更新時(shí)則先獲取記錄再賦值;涉及敏感字段時(shí)要限制massassignment;保存關(guān)聯(lián)模型時(shí)應(yīng)結(jié)合beginTran

如何在YII中創(chuàng)建基本路線? 如何在YII中創(chuàng)建基本路線? Jul 09, 2025 am 01:15 AM

TocreateabasicrouteinYii,firstsetupacontrollerbyplacingitinthecontrollersdirectorywithpropernamingandclassdefinitionextendingyii\web\Controller.1)Createanactionwithinthecontrollerbydefiningapublicmethodstartingwith"action".2)ConfigureURLstr

如何在YII控制器中創(chuàng)建自定義操作? 如何在YII控制器中創(chuàng)建自定義操作? Jul 12, 2025 am 12:35 AM

在Yii中創(chuàng)建自定義操作的方法是:在控制器中定義以action開頭的公共方法,可選地接受參數(shù);接著根據(jù)需要處理數(shù)據(jù)、渲染視圖或返回JSON;最后通過訪問控制確保安全。具體步驟包括:1.創(chuàng)建以action為前綴的方法;2.方法設(shè)為public;3.可接收URL參數(shù);4.處理數(shù)據(jù)如查詢模型、處理POST請(qǐng)求、重定向等;5.使用AccessControl或手動(dòng)檢查權(quán)限來限制訪問。例如,actionProfile($id)可通過/site/profile?id=123訪問,并渲染用戶資料頁面。最佳實(shí)踐是

YII開發(fā)人員:所需的角色,職責(zé)和技能 YII開發(fā)人員:所需的角色,職責(zé)和技能 Jul 12, 2025 am 12:11 AM

AYiidevelopercraftswebapplicationsusingtheYiiframework,requiringskillsinPHP,Yii-specificknowledge,andwebdevelopmentlifecyclemanagement.Keyresponsibilitiesinclude:1)Writingefficientcodetooptimizeperformance,2)Prioritizingsecuritytoprotectapplications,

如何在yii中使用Activerecord模式? 如何在yii中使用Activerecord模式? Jul 09, 2025 am 01:08 AM

TouseActiveRecordinYiieffectively,youcreateamodelclassforeachtableandinteractwiththedatabaseusingobject-orientedmethods.First,defineamodelclassextendingyii\db\ActiveRecordandspecifythecorrespondingtablenameviatableName().Youcangeneratemodelsautomatic

See all articles