restful api的那些事

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

 

 

 

 

 

 

 

 

  

  

  

posted @ 2020-01-17 17:04  离岸少年  阅读(195)  评论(0编辑  收藏  举报