Flutter网络请求重试插件dio_smart_retry的使用
Flutter网络请求重试插件dio_smart_retry的使用
dio_smart_retry
是一个用于 Dio
包的灵活重试库。它是已废弃的 dio_retry
包的下一代版本。默认情况下,该插件仅针对适当的可重试 HTTP 状态码进行重试,并支持动态设置重试之间的延迟。以下是关于如何使用 dio_smart_retry
的详细说明。
Contents
- Getting Started for Dio
- Usage
- Default Retryable Status Codes List
- Disable Retry
- Add Extra Retryable Status Codes
- Override Retryable Statuses
Getting Started for Dio
1. 添加依赖
在 pubspec.yaml
文件中添加以下依赖:
dependencies:
dio: ^5.0.0
dio_smart_retry: ^7.0.0
注意: 如果你使用的是旧版本的 Dio
(4.x 版本),请使用 dio_smart_retry: ^1.4.0
。
2. 导入包
在 Dart 文件中导入 dio_smart_retry
包:
import 'package:dio/dio.dart';
import 'package:dio_smart_retry/dio_smart_retry.dart';
Usage
只需将拦截器添加到你的 Dio
实例中即可:
final dio = Dio();
// Add the interceptor
dio.interceptors.add(
RetryInterceptor(
dio: dio,
logPrint: print, // specify log function (optional)
retries: 3, // retry count (optional)
retryDelays: const [
// set delays between retries (optional)
Duration(seconds: 1), // wait 1 sec before first retry
Duration(seconds: 2), // wait 2 sec before second retry
Duration(seconds: 3), // wait 3 sec before third retry
],
),
);
/// Sending a failing request for 3 times with 1s, then 2s, then 3s interval
await dio.get('https://mock.codes/500');
Default Retryable Status Codes List
默认情况下,以下 HTTP 状态码会被认为是可重试的:
- 408: RequestTimeout
- 429: TooManyRequests
- 500: InternalServerError
- 502: BadGateway
- 503: ServiceUnavailable
- 504: GatewayTimeout
- 440: LoginTimeout (IIS)
- 460: ClientClosedRequest (AWS Elastic Load Balancer)
- 499: ClientClosedRequest (ngnix)
- 520: WebServerReturnedUnknownError
- 521: WebServerIsDown
- 522: ConnectionTimedOut
- 523: OriginIsUnreachable
- 524: TimeoutOccurred
- 525: SSLHandshakeFailed
- 527: RailgunError
- 598: NetworkReadTimeoutError
- 599: NetworkConnectTimeoutError
你可以通过配置覆盖或扩展这个列表。
Disable Retry
你可以手动禁用特定请求的重试功能:
final request = RequestOptions(path: '/')
..disableRetry = true;
await dio.fetch<String>(request);
或者:
final options = Options()
..disableRetry = true;
await dio.get<String>('/', options: options);
Add Extra Retryable Status Codes
你可以添加自己的可重试状态码:
RetryInterceptor(
dio: dio,
retryableExtraStatuses: { status401Unauthorized },
)
或者:
RetryInterceptor(
dio: dio,
retryableExtraStatuses: { 401 },
)
Override Retryable Statuses
你可以覆盖默认的可重试状态码列表:
final myStatuses = { status400BadRequest, status409Conflict };
dio.interceptors.add(
RetryInterceptor(
dio: dio,
logPrint: print,
retryEvaluator: DefaultRetryEvaluator(myStatuses).evaluate,
),
);
await dio.get<dynamic>('https://mock.codes/400');
示例代码
下面是一个完整的示例代码,展示了如何使用 dio_smart_retry
插件:
import 'dart:async';
import 'package:dio/dio.dart';
import 'package:dio_smart_retry/dio_smart_retry.dart';
Future<void> main() async {
final dio = Dio();
// Add the interceptor
dio.interceptors.add(
RetryInterceptor(
dio: dio,
logPrint: print, // specify log function (optional)
retries: 4, // retry count (optional)
retryDelays: const [
// set delays between retries (optional)
Duration(seconds: 1), // wait 1 sec before the first retry
Duration(seconds: 2), // wait 2 sec before the second retry
Duration(seconds: 3), // wait 3 sec before the third retry
Duration(seconds: 4), // wait 4 sec before the fourth retry
],
),
);
try {
/// Sending a failing request for 4 times from 1s to 4s
await dio.get<dynamic>('https://mock.codes/500');
print('Request succeeded!');
} catch (e) {
print('Request failed after retries: $e');
}
}
希望这些信息能帮助你在 Flutter 项目中成功集成和使用 dio_smart_retry
插件!如果你有任何问题或需要进一步的帮助,请随时提问。
更多关于Flutter网络请求重试插件dio_smart_retry的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter网络请求重试插件dio_smart_retry的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用dio_smart_retry
插件来进行网络请求并实现重试机制的代码示例。dio_smart_retry
是一个基于dio
库的扩展,它允许你在网络请求失败时自动进行重试。
首先,确保你已经在pubspec.yaml
文件中添加了必要的依赖:
dependencies:
flutter:
sdk: flutter
dio: ^4.0.0 # 确保使用与dio_smart_retry兼容的版本
dio_smart_retry: ^2.0.0 # 确保使用最新版本
然后,在你的Flutter项目中,你可以按照以下步骤进行网络请求并启用重试机制:
- 导入必要的包:
import 'package:dio/dio.dart';
import 'package:dio_smart_retry/dio_smart_retry.dart';
- 配置
dio
实例并添加重试策略:
void main() {
// 创建并配置dio实例
final dio = Dio();
// 配置重试策略
final retryConfig = RetryConfig(
maxRetries: 3, // 最大重试次数
retryDelay: RetryDelay.exponential(
baseDelay: 1000, // 初始延迟时间(毫秒)
maxDelay: 5000, // 最大延迟时间(毫秒)
factor: 2, // 每次重试延迟时间的增长因子
),
shouldRetry: (response, error) {
// 自定义重试条件,可以根据响应状态码或错误信息决定是否重试
if (error != null) {
// 例如,只在网络错误时重试(如连接超时)
return error.response == null;
}
// 例如,只在HTTP状态码为5xx时重试
return response?.statusCode >= 500;
},
);
// 使用dio_smart_retry包装dio实例
final dioSmartRetry = DioSmartRetry(dio, retryConfig);
// 进行网络请求
dioSmartRetry.get('https://api.example.com/data')
.then((response) {
// 请求成功,处理响应数据
print('Response data: ${response.data}');
})
.catchError((error) {
// 请求失败,处理错误
print('Error: ${error.message}');
});
runApp(MyApp());
}
在这个示例中,我们:
- 创建了一个
dio
实例。 - 配置了一个
RetryConfig
对象,指定了最大重试次数、重试延迟策略以及自定义的重试条件。 - 使用
DioSmartRetry
包装了原始的dio
实例,以便在请求失败时自动重试。 - 使用包装后的
dioSmartRetry
实例进行了一个GET请求,并处理了成功和失败的响应。
这个配置确保了当网络请求遇到临时问题时(如网络不稳定、服务器临时故障等),客户端会自动进行重试,直到达到最大重试次数或请求成功为止。