Flutter网络请求重试插件dio_smart_retry的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter网络请求重试插件dio_smart_retry的使用

dio_smart_retry 是一个用于 Dio 包的灵活重试库。它是已废弃的 dio_retry 包的下一代版本。默认情况下,该插件仅针对适当的可重试 HTTP 状态码进行重试,并支持动态设置重试之间的延迟。以下是关于如何使用 dio_smart_retry 的详细说明。

Contents

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

1 回复

更多关于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项目中,你可以按照以下步骤进行网络请求并启用重试机制:

  1. 导入必要的包
import 'package:dio/dio.dart';
import 'package:dio_smart_retry/dio_smart_retry.dart';
  1. 配置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请求,并处理了成功和失败的响应。

这个配置确保了当网络请求遇到临时问题时(如网络不稳定、服务器临时故障等),客户端会自动进行重试,直到达到最大重试次数或请求成功为止。

回到顶部