♻️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:
Last updated