♻️Dio Smart Retry

Essa documentação serve apenas para mostrar o uso e possiveis maneiras de usar o DioSmartRetry.

Basicamente, é uma implementação para adicionar mais tentativas ao ter erro em requests.

O plugin é implementado de maneira super simples, no nosso caso, basta usar o arquivo dio_config da seguinte maneira:

class DioConfig {
  static final DioConfig _instance = DioConfig.internal();

  factory DioConfig() => _instance;

  DioConfig.internal();

  final String _baseUrl = Environments.baseUrl;

  Dio? _dio;

  CustomInterceptors? _customInterceptors;

  void initializeDio() {
    _dio = Dio(
      BaseOptions(
        baseUrl: _baseUrl,
        connectTimeout: const Duration(seconds: 20),
        receiveTimeout: const Duration(seconds: 20),
      ),
    );

    _customInterceptors = CustomInterceptors(_dio!);

    _dio?.interceptors.add(_customInterceptors!);

    _dio?.interceptors.add(
      RetryInterceptor(
        dio: _dio!,
        logPrint: log,
        retries: 3,
        retryDelays: const [
          Duration(seconds: 1),
          Duration(seconds: 2),
          Duration(seconds: 3),
        ],
      ),
    );
  }

  Dio get dio {
    if (_dio == null) {
      initializeDio();
    }
    return _dio!;
  }
}

class CustomInterceptors extends InterceptorsWrapper {
  final Dio? dio;

  CustomInterceptors(this.dio);

  @override
  Future onRequest(
      RequestOptions options, RequestInterceptorHandler handler) async {
    final auth = await Authentication.authenticated();
    if (auth) {
      final token = await Authentication.getToken();
      options.headers["Authorization"] = "Bearer $token";
    }
    options.headers["Accept"] = "application/json";
    return super.onRequest(options, handler);
  }
}

Nesse caso, estão sendo adicionadas 3 tentativas, com tempo de espero de 1, 2 e 3 segundos respectivamente. Caso após a última tentativa não obtenha sucesso, o erro é lançado normalmente.

O retry funciona para os seguintes status code de erros:

  • 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

Mas é possível adicionar mais, alterar quais serão, etc, basta seguir a documentação no link:

https://pub.dev/packages/dio_smart_retry

Last updated