不管是在前端还是在移动端的开发中,除了各式UI工具库的使用,使用最多的应该就是涉及到与后端交互的网络请求工具库了。在Flutter这边目前用到最多的应该就是Dio了。为了在项目中更方便的使用Dio,都会对其进行一些简单的封装。今天就记录一下自己的封装过程
导入dio
首先在pubspec.yaml中导入Dio库,然后get package。
创建Dio封装工具类
创建一个工具类,用于我们后续进行封装以及的使用。下面简单的说一下
class DioManager {
// 单利
static DioManager _instance ;
static DioManager getInstance() {
if(_instance == null) {
_instance = DioManager() ;
}
return _instance ;
}
}
进行一些对应的配置
Dio dio = Dio();
DioManager() {
dio.options.baseUrl = baseUrl ; //BaseURL的配置
dio.options.connectTimeout = 5000 ; //请求超时限制
dio.options.receiveTimeout = 3000 ;
dio.interceptors.add(LogInterceptor(requestBody: true));//是否开启请求日志
// dio.interceptors.add(CookieManager(CookieJar()));//缓存相关类,具体设置见https://github.com/flutterchina/cookie_jar
}
Get请求
//get请求
get(String url, FormData params, Function successCallBack,
Function errorCallBack) async {
_requestHttpMethod(url, successCallBack, 'get', params, errorCallBack);
}
Post请求
//post请求
post(String url, params, Function successCallBack,
Function errorCallBack) async {
_requestHttpMethod(url, successCallBack, "post", params, errorCallBack);
}
Post不带请求体的请求
//post请求,没有请求体
postNoParams(
String url, Function successCallBack, Function errorCallBack) async {
_requestHttpMethod(url, successCallBack, "post", null, errorCallBack);
}
请求的主体
// 请求的主体方法
_requestHttpMethod(String url , Function successCallBack , [String method , FormData params , Function errorCallBack]) async {
Response response ;
try {
if (method == 'get') {
if (params != null) {
response = await dio.get(url,
queryParameters: Map.fromEntries(params.fields));
} else {
response = await dio.get(url);
}
} else if (method == 'post') {
if (params != null && params.fields.isNotEmpty) {
response = await dio.post(url, data: params);
} else {
response = await dio.post(url);
}
}
} on DioError catch (error){
// 请求错误处理
Response errorResponse;
if (error.response != null) {
errorResponse = error.response;
} else {
errorResponse = new Response(statusCode: 201);
}
_error(errorCallBack, error.message);
return '';
}
String dataStr = json.encode(response.data);
Map<String, dynamic> dataMap = json.decode(dataStr);
//至于返回的status就看自己公司怎么约定的了
if (dataMap == null || dataMap['status'] != 200) {
_error(errorCallBack, dataMap['msg'].toString());
} else if (successCallBack != null) {
successCallBack(dataMap);
}
}
// 请求错误返回
_error(Function errorCallBack, String error) {
if (errorCallBack != null) {
errorCallBack(error);
}
}
以上就是对dio简单的封装了。下面讲一下使用了:
FormData params = FormData.fromMap({
'username':_username,
'password':_password,
});
DioManager.getInstance().post(Url, params, (result){
print(result);
//请求成功需要做的事
}, (error){
ToastUtil.show(error);
//失败后需要做的事
});
当然每个项目对传参的格式可能有不一样的要求。那就需要自己根据需求来了。
下面是Dio封装的完整代码:
class DioManager {
static DioManager _instance ;
static DioManager getInstance() {
if(_instance == null) {
_instance = DioManager() ;
}
return _instance ;
}
Dio dio = Dio();
DioManager() {
dio.options.baseUrl = baseUrl ;
dio.options.connectTimeout = 5000 ;
dio.options.receiveTimeout = 3000 ;
dio.interceptors.add(LogInterceptor(requestBody: true));
// dio.interceptors.add(CookieManager(CookieJar()));//缓存相关类,具体设置见https://github.com/flutterchina/cookie_jar
}
//get请求
get(String url, FormData params, Function successCallBack,
Function errorCallBack) async {
_requestHttpMethod(url, successCallBack, 'get', params, errorCallBack);
}
//post请求
post(String url, params, Function successCallBack,
Function errorCallBack) async {
_requestHttpMethod(url, successCallBack, "post", params, errorCallBack);
}
//post请求
postNoParams(
String url, Function successCallBack, Function errorCallBack) async {
_requestHttpMethod(url, successCallBack, "post", null, errorCallBack);
}
// 请求的主体
_requestHttpMethod(String url , Function successCallBack , [String method , FormData params , Function errorCallBack]) async {
Response response ;
try {
if (method == 'get') {
if (params != null) {
response = await dio.get(url,
queryParameters: Map.fromEntries(params.fields));
} else {
response = await dio.get(url);
}
} else if (method == 'post') {
if (params != null && params.fields.isNotEmpty) {
response = await dio.post(url, data: params);
} else {
response = await dio.post(url);
}
}
} on DioError catch (error){
// 请求错误处理
Response errorResponse;
if (error.response != null) {
errorResponse = error.response;
} else {
errorResponse = new Response(statusCode: 201);
}
_error(errorCallBack, error.message);
return '';
}
String dataStr = json.encode(response.data);
Map<String, dynamic> dataMap = json.decode(dataStr);
if (dataMap == null || dataMap['status'] != 200) {
_error(errorCallBack, dataMap['msg'].toString());
} else if (successCallBack != null) {
successCallBack(dataMap);
}
}
// 请求错误返回
_error(Function errorCallBack, String error) {
if (errorCallBack != null) {
errorCallBack(error);
}
}
}
大概就这些了,也基本上能满足我日常的开发使用了。可能还有更好的方式。以后学习理解的更深刻了再回过头来重新写吧。