Flutter dio网络请求需在请求secret后的方式三:Future

上一篇: Flutter dio网络请求需在请求secret后的方式二:匿名函数

前言

最近在使用Flutter写一个简单的小demo,网络请求使用的是dio库。
一般为了加强APP网络请求安全性,减少被某些第三方或个人乱刷API导致网络堵塞或信息泄露,需要APP或h5的所有业务请求接口里放一个从服务器获取的secret,也就说所有的请求都需要在获取secret的这个接口处理完成之后,在代码中每一次请求都要进行判断,具体可以操作的方式有如下三种:

方案三【使用Future异步执行】、

Flutter里的异步语法Future很好用,能很好的减少多重嵌套
实现原理:在每个业务接口请求时,在封装的类里进行统一判断是否已经加载好了secret,如果没加载好,使用Future异步延迟一秒重新加载自己
代码如下:

1.1 dio封装一个Request类

import 'dart:convert';
import 'package:convert/convert.dart';
import 'package:crypto/crypto.dart';
import 'dart:io';
import 'package:dio/dio.dart';
import 'dart:async';

class Request {

  static const String baseUrl = 'https://www.baidu.com/';
  static String secret = '';
  // 是否正在请求接口
  static bool isLoadingSecret = false;

  /**
 * 使用future的方式处理
*/
  static Future postAwaitSign({String action,Map params}) async{
    if(secret.isEmpty){
      if(isLoadingSecret){
      // 延迟1秒
        var data1 = await Future.delayed(const Duration(seconds:1), (){
            });
      // 重新调用自己
        var data2 = postAwaitSign(action: action,params: params);
        return data2;
      }else{
        isLoadingSecret = true;
        var data1 = await Request.post(
        action: 'mySecretSign',
        params: {"xxx": "xxxx"});
        Request.secret = data1['mySecret'];
        isLoadingSecret = false;
        if(action == null || action.isEmpty){
          return null;
        }else{
          var data2 = await Request.post(action: action,params: params);
          return data2;
        }
      }
      
    }else{
      if(action == null || action.isEmpty){
        return null;
      }else{
        var data2 = await Request.post(action: action,params: params);
        return data2;
      }
    }
  }
/**
* 真正请求方法
*/
 static Future post({String action,Map params}) async {
    var dio = createDio();
    if(action == null || action.isEmpty){
      return null;
    }
    if(params == null){
      params = {};
    }
    var sendParams = {};
    sendParams.addAll(params);
    sendParams['mySign'] = secret;
    try{
       Response response = await dio.post(action,data:sendParams);
       var responseData = response.data;
       return data;
    }on Exception catch (e){
       print(">>>>>>>>>>");
        print(e);
       return null;
    }
   
  }
  static Dio createDio(){
    var options = BaseOptions(
      baseUrl: baseUrl,
      connectTimeout: 10000,
      receiveTimeout: 100000,
      contentType: ContentType.json,
    );
    return Dio(options);
  }
}

1.2 只需要根据业务接口进行请求就可以了

class MyHomePage extends StatefulWidget{
  @override
  State createState() {
    return MyHomePageState();
  }
}

class MyHomePageState extends State{
  @override
  void initState() {
    loadNewData();
    super.initState();
  }
  void loadNewData() async{
   var data = await Request.postAwaitSign(action: '/myhome/homeInfo',params:{xxx:xxx});
    print("444444444");
    print(data);
  }
  @override
  Widget build(BuildContext context) {
    return xxxx;
  }
}

你可能感兴趣的:(Flutter dio网络请求需在请求secret后的方式三:Future)