yii2写api接口步骤【yii框架教程】,yii2,写接口
作者:搜搜PHP网发布时间:2019-12-01分类:YII浏览:55
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网别的相干文章!
相关推荐
- Yii2.0框架怎么下载?_yii框架教程,yii,yii2
- Yii2.0是什么语言写的?_yii框架教程,yii2,php
- yii2如何关闭调试_yii框架教程,yii2,调试
- yii2 redis 报错怎么办_yii框架教程,yii2
- yii2安装为什么很慢_yii框架教程,yii2
- yii2怎么使用user组件_yii框架教程,yii2,user组件,使用方法
- yii2.0怎么引入js_yii框架教程,yii2,js
- yii2中400错误解决方法_yii框架教程,yii2
- yii2与tp5的区别_yii框架教程,yii2,tp5
- yii2如何连接多个数据库_yii框架教程,yii2,数据库
- YII排行
- 最新文章
- 广而告之