ThinkPHP5.0 API开发前进行配置路由和参数过滤
在被最新版TP5.1完虐了几天后,踩坑踩得都心情好几天都不好了。所以 决定放弃最新版,采用相对稳定版TP5.0.10版本进行 Restful API 开发:
1. 在进行开发前最需要得做的是配置本地域名,以及路由配置:
(1)本地域名配置,前面得博文我已经讲过,这里就不再复述了; (2)这个版本路由配置,要比5.1版本要简单得多,直接在application目录下找到route.php文件,然后配置 如下:
2. 然后在application目录下,新建文件: (1) app/controller/Common.php (2) app/controller/User.php (3) app/controller/Article.php (4) ...
3. 验证过滤参数
(1)验证请求时间是否过期(默认设置60s) (2)验证客户端传递过来得token是否与服务端得token是否匹配 (3)验证客户端传递过来得其他参数是否格式正确(用户名,密码等)
4. 在其他控制器内部继承Common类;即可以在请求当前控制器方法时,进行过滤校验
5. 模拟发出请求:api.movi.com/user ,响应结果为:
7. 验证过滤参数类Common.php源码:
https://github.com/RiversCoder/tp5-api/blob/master/application/api/controller/Common.php
1. 在进行开发前最需要得做的是配置本地域名,以及路由配置:
(1)本地域名配置,前面得博文我已经讲过,这里就不再复述了; (2)这个版本路由配置,要比5.1版本要简单得多,直接在application目录下找到route.php文件,然后配置 如下:
use thinkRoute;
// api.movi.com -> www.movi.com/index.php/api
Route::domain("api", "api");
// api.movi.com/user/login -> api.movi.com/user
Route::post("user", "user/login");2. 然后在application目录下,新建文件: (1) app/controller/Common.php (2) app/controller/User.php (3) app/controller/Article.php (4) ...
3. 验证过滤参数
(1)验证请求时间是否过期(默认设置60s) (2)验证客户端传递过来得token是否与服务端得token是否匹配 (3)验证客户端传递过来得其他参数是否格式正确(用户名,密码等)
4. 在其他控制器内部继承Common类;即可以在请求当前控制器方法时,进行过滤校验
//User.php
namespace appapicontroller;
class User extends Common
{
public function login()
{
$data = $this->params;
dump($data);
}
}5. 模拟发出请求:api.movi.com/user ,响应结果为:
array (size=2) "user_name" => string "asdadassad_ss"(length=13) "user_pwd" => string "adminss" (length=7)
6. 整个过滤的逻辑:
<?php
namespace appapicontroller;
use thinkController;
use thinkRequest;
use thinkValidate;
class Common extends Controller
{
protected $req; //用来处理客户端传递过来的参数
protected $validater; //用来验证数据/参数
protected $params; //过滤后符合要求的参数
//控制器下面方法所要接受参数的
protected $rules = array(
"User" => array(
"login" => array(
"user_name" => ["require", "chsDash", "max" => 20],
"user_pwd" => ["require", "max" => 16, "min" => 6],
),
"register" => array(),
),
);
protected function _initialize()
{
parent::_initialize();
$this->req = Request::instance();
//1. 检车请求时间是否超时
$this->checkTime($this->req->only(["time"]));
//2. 验证token
$this->checkToken($this->req->param());
//3. 验证参数,返回成功过滤后的参数数组
$this->params = $this->checkParams($this->req->except(["time", "token"]));
}
//检测请求的时间是否超时
public function checkTime($arr)
{
//$this->returnMsg(400, "请求超时!");
if (!isset($arr["time"]) || intval($arr["time"]) <= 1) {
$this->returnMsg(400, "时间戳不存在!");
}
if (time() - intval($arr["time"]) > 10) {
$this->returnMsg(400, "请求超时!");
}
}
//验证token方法 (防止篡改数据)
/*
$arr: 全部请求参数
return : json
*/
protected function checkToken($arr)
{
//检测客户端是否传递过来token数据
if (!isset($arr["token"]) || empty($arr["token"])) {
$this->returnMsg(400, "token不能为空");
}
//这是客户端api传递过来的token
$app_token = $arr["token"];
//如果已经传递token数据,就删除token数据,生成服务端token与客户端的token做对比
unset($arr["token"]);
$session_token = "";
foreach ($arr as $key => $val) {
$session_token .= md5($val);
}
$session_token = md5("api_" . $session_token . "_api");
//echo $session_token;die; //调试输出
//如果传递过来的token不相等
if ($app_token !== $session_token) {
$this->returnMsg(400, "token值不正确");
}
}
//检测客户端传递过来的其他参数(用户名,其他相关)
/*
param: $arr [除了time,token以外的其他参数]
return: [合格的参数数组]
*/
protected function checkParams($arr)
{
//1. 获取验证规则 (Array)
$rule = $this->rules[$this->req->controller()][$this->req->action()];
//2. 验证参数并且返回错误
$this->validater = new Validate($rule);
if (!$this->validater->check($arr)) {
$this->returnMsg(400, $this->validater->getError());
}
//3. 如果正常,就通过验证
return $arr;
}
//返回信息
protected function returnMsg($code, $msg = "", $data = [])
{
$return_data["code"] = $code;
$return_data["msg"] = $msg;
$return_data["data"] = $data;
echo json_encode($return_data);die;
}
}
7. 验证过滤参数类Common.php源码:
https://github.com/RiversCoder/tp5-api/blob/master/application/api/controller/Common.php
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: ThinkPHP5的重定向问题
- 下一篇: php安全篇值过滤用户输入的人参数
