Yii2.0 实现API接口
第一步
复制一份backend并且改名为api,打开config里的main.php,将id修改为app-id
第二步
1.修改components里的user
"user" => [
"identityClass" => "commonmodelsmemberMember",
"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" => "yiiwebResponse",
"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" => "yiiwebUrlManager",
"enablePrettyUrl" => true,
"enableStrictParsing" => true,
"showScriptName" => false,
"suffix" => ".html", // api后缀
"rules" => [
#################
## Order API ##
#################
# http://域名/api/v1/order
[
"class" => "yii
estUrlRule",
"controller" => ["v1/order"],
"pluralize" => false, // 关闭复数模式
"extraPatterns" => [
"GET detail" => "detail", // 以GET请求 http://域名/api/v1/order/detail.html
]
],
]
],
第三步
编写基类控制器
在controllers里创建AController.php
<?php
namespace apicontrollers;
use Yii;
use yii
estActiveController;
use yiiwebResponse;
use yiifiltersauthQueryParamAuth;
use yiifiltersauthHttpBasicAuth;
use yiifiltersauthCompositeAuth;
use yiifiltersCors;
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 apimodulesv1controllers;
use Yii;
use apimodulesv1controllersAController;
use apimodulesv1modelsLoginForm;
class SiteController extends AController
{
public $modelClass = "apimodulesv1modelsMember";
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一下
}
}
小生这厢有礼了(๑´ڡ`๑)
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。