• restful api的那些事


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

     

     

      

      

      

  • 相关阅读:
    TYVJ P1092 麻将
    BZOJ 1020——[SHOI2008]安全的航线flight
    JSOI2008 火星人prefix
    Silverlight下“DataGrid”和“Pdf”导出
    Jquery实现“Iframe”页面切换
    遍历表,执行存储过程的方法
    “JS”和“Aspx”之注册“JS脚本”、刷新页面、TreeNode下JS连接设置
    WeatherWebService
    WCF方法“异步调用”的“同步问题”
    “Silverlight”中获取“HTML元素和参数”及JS交互
  • 原文地址:https://www.cnblogs.com/jackzhuo/p/12206661.html
Copyright © 2020-2023  润新知