Yii2.0 實現API介面
阿新 • • 發佈:2019-02-09
##第一步
複製一份backend並且改名為api,開啟config裡的main.php,將id修改為app-id
##第二步
#####1.修改components裡的user
'user' => [
'identityClass' => 'common\models\member\Member',
'enableAutoLogin' => true,
'enableSession' => false,
],
#####2.在components裡新增response, 這串程式碼的用途是讓api請求均為200,其他http狀態碼會以json資料返回
舉個例子:api請求原本為502錯誤。但我加上這段配置以後,api請求就會變成200,不會報502。但是api返回的json資料就會變成(當然,前提是你api返回規範就是json資料)
{'error':502,'msg':'502 Bad Gateway','data':...}
'response' => [ 'class' => 'yii\web\Response', 'on beforeSend' => function ($event) { $response = $event -> sender; $res_data = $response -> data; if ($response->data !== null && !isset($res_data['error'])) { $response -> data = [ 'error' => $res_data['status'], 'msg' => $res_data['message'], 'data' => [ 'name' => $res_data['name'], 'code' => $res_data['code'], 'type' => $res_data['type'], ], ]; $response -> statusCode = 200; } }, ],
#####3.在components裡新增urlManager,這裡就是你要配置的api(寫好API方法一定要在這裡註冊上去!!!)
'urlManager' => [ 'class' => 'yii\web\UrlManager', 'enablePrettyUrl' => true, 'enableStrictParsing' => true, 'showScriptName' => false, 'suffix' => '.html', // api字尾 'rules' => [ ################# ## Order API ## ################# # http://域名/api/v1/order [ 'class' => 'yii\rest\UrlRule', 'controller' => ['v1/order'], 'pluralize' => false, // 關閉複數模式 'extraPatterns' => [ 'GET detail' => 'detail', // 以GET請求 http://域名/api/v1/order/detail.html ] ], ] ],
##第三步
編寫基類控制器
在controllers裡建立AController.php
<?php
namespace api\controllers;
use Yii;
use yii\rest\ActiveController;
use yii\web\Response;
use yii\filters\auth\QueryParamAuth;
use yii\filters\auth\HttpBasicAuth;
use yii\filters\auth\CompositeAuth;
use yii\filters\Cors;
class AController extends ActiveController
{
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['authenticator'] = [
'class' => CompositeAuth::className(),
'authMethods' => [
# 下面是三種驗證access_token方式
//HttpBasicAuth::className(),
//HttpBearerAuth::className(),
# 這是GET引數驗證的方式
# http://10.10.10.252:600/user/index/index?access-token=xxxxxxxxxxxxxxxxxxxx
QueryParamAuth::className(),
],
// 寫在optional裡的方法不需要token驗證
'optional' => [],
];
// 這個是跨域配置
$behaviors['corsFilter'] = [
'class' => Cors::className(),
'cors' => [
'Origin' => ['*'],
// restrict access to
'Access-Control-Request-Method' => ['POST', 'GET', 'DEL'],
// Allow only POST and PUT methods
'Access-Control-Request-Headers' => ['Origin', 'X-Requested-With', 'Content-Type', 'Accept'],
// Allow only headers 'X-Wsse'
'Access-Control-Allow-Credentials' => true,
// Allow OPTIONS caching
'Access-Control-Max-Age' => 3600,
// Allow the X-Pagination-Current-Page header to be exposed to the browser.
'Access-Control-Expose-Headers' => ['X-Pagination-Current-Page'],
],
];
#定義返回格式是:JSON
$behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_JSON;
return $behaviors;
}
}
##第四步
開始你的api工程吧!!!
我就先放上我的Logout退出登入給各位參考一下!
<?php
namespace api\modules\v1\controllers;
use Yii;
use api\modules\v1\controllers\AController;
use api\modules\v1\models\LoginForm;
class SiteController extends AController
{
public $modelClass = 'api\modules\v1\models\Member';
public function behaviors()
{
$behaviors = parent::behaviors();
unset($behaviors['authenticator']['optional']); // 銷燬基類的optional
// 重寫optional 不需要token驗證的方法login
$behaviors['authenticator']['optional'] = [
'login',
];
return $behaviors;
}
public function actions()
{
$actions = parent::actions();
// 這一些都是Yii自帶的RESTful API方法,我都給銷燬了,因為...RESTful風格不太會,哈哈
unset($actions['index']);
unset($actions['view']);
unset($actions['create']);
unset($actions['update']);
unset($actions['delete']);
return $actions;
}
/**
* 退出登入
*/
public function actionLogout()
{
$msgdata = [
'error' => 1,
'msg' => '未知錯誤',
];
if((new LoginForm) -> logout()) {
$msgdata = [
'error' => 0,
'msg' => '退出成功',
];
}else {
$msgdata['msg'] = '退出失敗';
}
return $msgdata; // 因為基類有配置過返回格式轉換為json,所以直接return不搭嘎
// 當然也可以自己json_encode一下
}
}
小生這廂有禮了(๑´ڡ`๑)