我可以为您详细讲解“详解Flutter中网络框架dio的二次封装”的完整攻略。
一、dio网络框架简介
dio是一款基于Dart语言、纯Flutter应用的轻量级、强大的网络请求框架,提供了诸多功能,例如:
- restful请求封装
- 拦截器机制
- 全局error统一处理
- FormData、拼接url参数、header封装
- 下载进度、上传进度监听等
dio是Flutter官方推荐的网络请求框架,使用方便、扩展性强,不仅适用于Flutter应用,也可以用于Dart命令行脚本、Flutter Web开发等场景。
二、dio网络请求封装
封装dio的网络请求,可以在项目开发中快速、高效地进行网络请求,避免过多的代码重复,在项目的后期维护中也更加容易。
1. 创建网络请求公共类
我们可以创建一个HttpUtil
公共类进行网络请求封装,该类中包含了常见的GET、POST请求方法,以及公共的请求参数、请求头部等。
class HttpUtil {
Dio _dio;
BaseOptions _options;
// 初始化请求头部
Map<String, dynamic> headers = {
'Content-Type': 'application/json;charset=UTF-8',
};
HttpUtil() {
// 初始化dio配置
_options = BaseOptions(
baseUrl: 'https://api.example.com/',
connectTimeout: 5000,
headers: headers,
);
_dio = Dio(_options);
// 添加全局拦截器
_dio.interceptors.add(LogInterceptor(responseBody: false));
_dio.interceptors.add(InterceptorsWrapper(
onError: (DioError error, handler) {
dioErrorIntercept(error);
handler.next(error);
},
onRequest: (RequestOptions options, handler) {
dioRequestIntercept(options);
handler.next(options);
},
onResponse: (Response response, handler) {
dioResponseIntercept(response);
handler.next(response);
},
));
}
/// 对dio请求进行错误拦截处理
static void dioErrorIntercept(DioError error) {
print(error);
switch (error.type) {
case DioErrorType.CONNECT_TIMEOUT:
// 连接超时
break;
case DioErrorType.RECEIVE_TIMEOUT:
// 接收超时
break;
case DioErrorType.RESPONSE:
// 服务端异常
break;
case DioErrorType.CANCEL:
// 取消请求操作
break;
case DioErrorType.DEFAULT:
// 默认
break;
}
}
/// 对dio请求进行请求拦截处理
static void dioRequestIntercept(RequestOptions options) {
// 在请求被发送之前做一些预处理:例如加密处理、缓存处理等
print(options);
}
/// 对dio请求进行响应拦截处理
static void dioResponseIntercept(Response response) {
// 在响应被解析前做一些预处理:例如错误码统一处理、Json解析等
print(response);
}
/// 发起get请求
Future<Response<T>> get<T>(String path, {Map<String, dynamic> params}) {
return _dio.get<T>(path, queryParameters: params);
}
/// 发起post请求
Future<Response<T>> post<T>(
String path, {
dynamic data,
Map<String, dynamic> params,
}) {
return _dio.post<T>(
path,
data: data,
queryParameters: params,
);
}
}
2. 创建二次封装类
我们可以在项目的network
目录下创建api.dart
二次封装类,该类中包含了各个接口的具体请求方法,方便接口调用。
例如,我们创建了一个UserApi
类,提供了登录接口:
class UserApi {
static login({String username, String password}) {
final params = {
'username': username,
'password': password,
};
return HttpUtil().get('user/login', params: params);
}
}
3. 调用二次封装类
在项目中直接调用UserApi
类进行接口请求即可:
UserApi.login(username: 'admin', password: '123456')
.then((response) {
print(response.data);
})
.catchError((error) {
print(error);
});
三、示例说明
下面,我们以get
请求方法和post
请求方法为例,进行详细的示例说明。
1. GET请求示例
我们可以在UserApi
类中提供用户信息的接口,假设该接口需要传递用户的id参数,我们可以这样封装:
class UserApi {
static getUserInfo({int userId}) {
final params = {
'userId': userId,
};
return HttpUtil().get('user/info', params: params);
}
}
在项目中可以通过如下方式调用接口:
UserApi.getUserInfo(userId: 10001)
.then((response) {
print(response.data);
})
.catchError((error) {
print(error);
});
2. POST请求示例
我们可以在UserApi
类中提供用户注册的接口,假设该接口需要传递用户的用户名和密码参数,我们可以这样封装:
class UserApi {
static register({String username, String password}) {
final data = {
'username': username,
'password': password,
};
return HttpUtil().post('user/register', data: data);
}
}
在项目中可以通过如下方式调用接口:
UserApi.register(username: 'admin', password: '123456')
.then((response) {
print(response.data);
})
.catchError((error) {
print(error);
});
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Flutter中网络框架dio的二次封装 - Python技术站