flutter dio^5.3.3实现刷新token
在Flutter中使用Dio库实现刷新Token,通常需要定义一个全局的Token管理器,并在Dio的拦截器中处理Token的刷新逻辑。以下是一个简单的示例:
import 'package:dio/dio.dart';
class TokenRefresher {
final Dio dio;
final String refreshTokenUrl;
TokenRefresher(this.dio, this.refreshTokenUrl);
Future<void> refreshToken() async {
// 发起请求去刷新token
try {
Response response = await dio.post(refreshTokenUrl);
// 假设响应体中包含新的token
String newAccessToken = response.data['access_token'];
// 更新dio的header中的token
dio.options.headers['Authorization'] = 'Bearer $newAccessToken';
} catch (e) {
// 处理异常情况,例如:token无法刷新的情况
rethrow;
}
}
}
void setupDio(Dio dio) {
dio.interceptors.add(InterceptorsWrapper(
onRequest: (RequestOptions options, RequestInterceptorHandler handler) {
// 可以在这里添加对token有效性的检查和刷新逻辑
// 如果token无效,可以调用TokenRefresher的refreshToken方法
// 然后继续执行请求
handler.next(options); // 继续执行请求
},
onResponse: (Response response, ResponseInterceptorHandler handler) {
// 可以在这里处理响应,例如检查token过期等
handler.next(response); // 继续处理响应
},
onError: (DioError err, ErrorInterceptorHandler handler) {
// 如果遇到token无效或者过期等问题,可以在这里尝试刷新token
// 如果刷新成功,重新发起请求
if (err.response?.statusCode == 401) { // 假设401是token无效的状态码
TokenRefresher(dio, '').refreshToken().then((_) {
// 重新发起请求
handler.next(err);
}).catchError((_) {
// 如果刷新失败,则传递错误
handler.next(err);
});
} else {
handler.next(err); // 其他错误继续传递
}
},
));
}
// 使用示例
void main() {
Dio dio = Dio();
setupDio(dio);
// 之后可以使用dio发起网络请求,如果token过期或者无效,会尝试自动刷新token
}
在这个示例中,TokenRefresher
类负责定义如何刷新token,并更新Dio的header。setupDio
函数则是配置Dio实例,使其在请求被拦截时,如果检测到token无效或过期,则尝试自动刷新token。如果刷新成功,则继续执行之前的请求;如果刷新失败,则抛出异常。
评论已关闭