首页 - 通讯 - restful api的那些事

restful api的那些事

2023-09-24 06:10
-->

1.restful api 简介

传统api:

2.http状态码

3.数据结构格式

4.不可预知的api错误解决方案:

如使用框架,可写个类,重构错误提示。如TP框架可继承Handle并重载render方法:

并配置:

YII2框架在先在config的components中配置

'errorHandler' => [
//'errorAction' => 'site/error',
'class' => 'common\components\EerrorHandler',
],

然后在common\components\目录下新建类:

其他框架可自行配置

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.注意事项:

  

  

  

-->