1.restful api 简介
传统api:
2.http状态码
3.数据结构格式
4.不可预知的api错误解决方案:
如使用框架,可写个类,重构错误提示。如TP框架可继承Handle并重载render方法:
并配置:
YII2框架在先在config的components中配置
'errorHandler' => [ //'errorAction' => 'site/error', 'class' => 'commoncomponentsEerrorHandler', ],
然后在commoncomponents目录下新建类:
其他框架可自行配置
5.API数据安全解决方案
下面是基于Yii框架所配置sign验证
生成sign:
public function setSign($data=[]){ //1.按字段排序 ksort($data); //2.拼接字符串数据 $str=http_build_query($data);//http_build_query()就是将一个数组转换成url 问号?后面的参数字符串,并且会自动进行urlencode处理。 //3.通过aes来加密字符串 $salt=$this->secretKey; $str=Yii::$app->getSecurity()->encryptByPassword($str,$salt); //4.所有字符串转换大写 //$str=strtoupper($str); //将乱码转化成base64 $str=base64_encode($str); return $str; }
在每个base中初始化:
/* * 初始化 * */ public function init(){ $this->checkRequestAuth(); } /* * 检查每次的请求是否合法 * */ public function checkRequestAuth(){ //首先需要获取headers $header=Yii::$app->request->headers; // todo //sign 加密需要 客户端工程师 解密:服务端工程师 //基础参数校验 if (empty($header['sign'])){ echo Json::encode(['code'=>400,'msg'=>'sign未定义']);exit; } if (empty($header['did'])){ echo Json::encode(['code'=>400,'msg'=>'did未定义']);exit; } //检验sign if (!$this->checkSign($header)){ echo Json::encode(['code'=>400,'msg'=>'sign错误']);exit; } }
sign检查:
/* * 检验sign是否正常 * * */ public function checkSign($data){ //解密 转base64 $sign=Yii::$app->getSecurity()->decryptByPassword(base64_decode($data['sign']),$this->secretKey); if (empty($sign)){ return false; } parse_str($sign,$signArr); if (!is_array($signArr) || empty($signArr['did']) || $signArr['did'] != $data['did']){ return false; } //sign 过期时间验证 // if (empty($signArr['time']) || time()-ceil($signArr['time']/1000) > $this->sign_time){ // return false; // } //sign 缓存过期时间验证 保证sign的唯一性 if (Yii::$app->redis->get($data['sign'])){ return false; } //var_dump($signArr); return true; }
6.API接口开发实例(注册路由):
7.注意事项: