hi,你好!欢迎访问本站!登录
本站由简数采集腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - PHP框架 - YII - 正文 请牢记本站网址www.sosophp.cn

yii2写api接口步骤【yii框架教程】,yii2,写接口

2019-12-01YII搜搜PHP网37°c
A+ A-

yii2写api接口步骤

Yii2怎样完成RESTful作风的API(引荐:《YII教程》 )

1、竖立零丁的运用顺序

为了增添顺序的可维护性,易操纵性,我们挑选新建一套运用顺序,这也是为了和前台运用、背景运用区离开操纵。

在WEB前端(frontend)和后端(backend)的同级目次,新建一个文件夹,定名api,其目次构造以下所示:

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

可以看出其目次构造基本上同backend没有其他差别,因为我们就是拷贝backend项目,只是做了部份优化。

友谊提醒,该步骤完成今后,须要修正common\config\bootstrap.php文件,对新建的运用增添alias别号

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

2、为新建的api运用顺序美化路由

起首保证你的web服务器开启rewrite划定规矩,细节我们就不说了,不过这是条件。

接着设置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;
    }
}

末了只须要在运用进口同级增添.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

用了便于演示申明,我们新建一张数据表goods表,并向个中插进去几条数据。

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信息

如今,我们的api目次构造应当多个下面这几个目次

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

须要申明的是:在生成modules的步骤中,为了使我们的模块可以接见,不要忘记在main.php设置文件中增加下面的代码

<?php    
    ......
    'modules' => [
        'v1' => [
            'class' => 'api\modules\v1\Module',
        ],
    ],
    ......

4、重新设置控制器

为了完成restful作风的api,在yii2中,我们须要对控制器举行一下改写

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

5、为Goods设置Url划定规矩

'rules' => [
    [
        'class' => 'yii\rest\UrlRule',
        'controller' => ['v1/goods']
    ],
]

6、模仿要求操纵

经由上面几个步骤,到此我们已为goods胜利建立了满足restful作风的api了。为了更好更轻易的演示,我们借助东西postman举行模仿要求。

为了见证一下我们的操纵,我们用postman要求一下GET /v1/goods看看效果怎样:

接着我们先应用gii生成modules后,再应用gii模块,根据下图中生成goods信息

如今,我们的api目次构造应当多个下面这几个目次

从上面截图中可以清晰的看到,GET /v1/goods 已可以很轻易的猎取我们表中的数据了。

固然,yii2还对该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 支撑的动词

不信的话我们可以应用postman发送一个post要求到/v1/goods,我们会发现胜利建立了一个新的商品。

须要提醒的是,操纵中还请仔细且注重:假如你的控制器末尾不是复数(比方是blog非blogs)请保证要求的时刻是复数!这是因为在RESTful架构中,网址中只能有名词而不能包含动词,名词又每每与数据表相对应,数据表呢又是一个“鸠合”,因而该名词每每是复数的情势。

7、关于受权认证

为何须要受权认证?这在平常的操纵中是须要的。比方说用户要设置本身的信息。

为了对yii2 restful受权认证说的更清晰,我们将会以两个两种差别的要领举行申明。

起首须要开启认证:

假定我们已根据第3步建立了包含字段access-token的数据表user,而且应用gii上生成了相应的model和controller

设置main.php文件

'components' => [
    'user' => [ 
        'identityClass' => 'common\models\User',
        'enableAutoLogin' => true,
        'enableSession'=>false
    ],
],

为控制器设置authenticator行动指定认证体式格局

<?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 = 'api\models\User';
    public function behaviors() {
        return ArrayHelper::merge (parent::behaviors(), [ 
                'authenticator' => [ 
                    'class' => QueryParamAuth::className() 
                ] 
        ] );
    }
}

末了我们还须要在identityClass中完成findIdentityByAccessToken要领

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

如此一来,我们先经由过程postman模仿不带access-token要求看效果

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

提醒401 我们没有权限接见!

我们在要求的链接上照顾准确的access-token,认证经由过程后,控制器会再继承实行其他搜检(频次限定、操纵权限等),才可以返回准确的用户信息。

须要提醒的是:经由过程url的情势对access-token通报存在肯定的风险,有能够会形成数据的走漏!平常而言,access-token须要放到HTTP头中举行通报!除非客户端的要求是jsonp花样的!

关于受权认证,我们有一篇更细致的文章,包含一套完整案例、服务端返回的数据范例定义、自定义毛病机制等。

8、速度限定

速度限定,该操纵完整也是出于平安斟酌,我们须要限定统一接口某时候段过量的要求。

速度限定默许不启用,用启用速度限定,yii\web\User::identityClass 应当完成yii\filters\RateLimitInterface,也就是说我们的common\models\User.php须要完成yii\filters\RateLimitInterface接口的三个要领,详细代码可参考:

use yii\filters\RateLimitInterface;
use yii\web\IdentityInterface;
class User extends ActiveRecord implements IdentityInterface, RateLimitInterface
{
    // other code ...... 
    // 返回某一时候许可要求的最大数目,比方设置10秒内最多5次要求(小数目轻易我们模仿测试)
    public  function getRateLimit($request, $action){  
         return [5, 10];  
    }
     
    // 回盈余的许可的要乞降相应的UNIX时候戳数 当末了一次速度限定搜检时
    public  function loadAllowance($request, $action){  
         return [$this->allowance, $this->allowance_updated_at];  
    }  
     
    // 保留许可盈余的要求数和当前的UNIX时候戳
    public  function saveAllowance($request, $action, $allowance, $timestamp){ 
        $this->allowance = $allowance;  
        $this->allowance_updated_at = $timestamp;  
        $this->save();  
    }  
}

须要注重的是,你依然须要在数据表User中新增添两个字段

allowance:盈余的许可的要求数目

allowance_updated_at:相应的UNIX时候戳数

在我们启用了速度限定后,Yii 会自动运用 yii\filters\RateLimiter 为 yii\rest\Controller 设置一个行动过滤器来实行速度限定搜检。

如今我们经由过程postman要求v1/users再看看效果,会发如今10秒内挪用凌驾5次API接口,我们会获得状况为429太多要求的非常信息。

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

9、关于版本

为了兼容汗青版本而且斟酌向后兼容性,我们在一开始操纵的时刻就以URL的体式格局完成了版本话,这里就不再举行论述了。

10、毛病处置惩罚

Yii的REST框架的HTTP状况代码可参考以下就好,没啥好说的

200: OK。一切正常。

201: 相应 POST 要求时胜利建立一个资本。Location header 包含的URL指向新建立的资本。

204: 该要求被胜利处置惩罚,相应不包含正文内容 (相似 DELETE 要求)。

304: 资本没有被修正。可以运用缓存的版本。

400: 毛病的要求。能够经由过程用户方面的多种缘由引发的,比方在要求体内有无效的JSON 数据,无效的操纵参数,等等。

401: 考证失利。

403: 已经由身份考证的用户不许可接见指定的 API 末尾。

404: 所要求的资本不存在。

405: 不被许可的要领。 请搜检 Allow header 许可的HTTP要领。

415: 不支撑的媒体范例。 所要求的内容范例或版本号是无效的。

422: 数据考证失利 (比方,相应一个 POST 要求)。 请搜检相应体内细致的毛病音讯。

429: 要求过量。 因为限速要求被谢绝。

500: 内部服务器毛病。 这多是因为内部顺序毛病引发的。

以上就是yii2写api接口步骤的细致内容,更多请关注ki4网别的相干文章!

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  选择分享方式
  移步手机端
yii2写api接口步骤【yii框架教程】,yii2,写接口

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
标签: