下一篇: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<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 在起始App时就加载secret
class TabBarPage extends StatefulWidget{
@override
State<StatefulWidget> createState() {
return TabBarPageState();
}
}
class TabBarPageState extends State<TabBarPage>{
@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<StatefulWidget> createState() {
return MyHomePageState();
}
}
class MyHomePageState extends State<MyHomePage>{
@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;
}
}
网友评论