Flutter dio网络请求需在请求secret后的方式一:请求时判断

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

前言

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

方案一【暴力直接形】、

在应用启动后就开始请求secret接口,同时在每个业务接口调用时都进行判断,如果secret已经请求好,则发起业务接口请求,否则延迟1秒后再进行相同的判断,代码如下:

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 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 在起始App时就加载secret

class TabBarPage extends StatefulWidget{
  @override
  State createState() {
    return TabBarPageState();
  }
}

class TabBarPageState extends State{
  @override
  void initState() {
    // 初始化获取secret
    requestSecrect();
    super.initState();
  }
  void requestSecrect() async {
    Request.isLoadingSecret = true;
    var data = await Request.post(
          action: 'mySecretSign',
          params: {"xxx": "xxx"});
    Request.secret = data['mySecret'];
    Request.isLoadingSecret = false;
    print("111111111111");
    print(Request.secret);
  }
  @override
  Widget build(BuildContext context) {
    return xxxx;
  }
}

1.3 在加载业务接口时进行判断,如果secret不存在,则延迟一秒重新请求

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

class MyHomePageState extends State{
  @override
  void initState() {
    loadNewData();
    super.initState();
  }
  void loadNewData() async{
    // 如果secret没有加载好,则延迟1秒继续加载
    if(Request.secret.isEmpty){
      Future.delayed(const Duration(seconds:1), (){
          loadNewData();
      });
      return;
    }
    var data = await Request.post(action: '/myhome/homeInfo');
    print("22222222");
    print(data);
  }
  @override
  Widget build(BuildContext context) {
    return xxxx;
  }
}

你可能感兴趣的:(Flutter dio网络请求需在请求secret后的方式一:请求时判断)