上一篇: 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<dynamic> 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<dynamic> 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<Map> 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<StatefulWidget> createState() {
return MyHomePageState();
}
}
class MyHomePageState extends State<MyHomePage>{
@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;
}
}