onError method

  1. @override
Future<void> onError(
  1. DioException err,
  2. ErrorInterceptorHandler handler
)
override

Called when an exception was occurred during the request.

Implementation

@override
Future<void> onError(
  DioException err,
  ErrorInterceptorHandler handler,
) async {
  // リトライ回数を取得
  final retryCount = err.requestOptions.extra['retryCount'] ?? 0;

  // 401エラーかつリトライ回数が最大リトライ回数未満の場合
  if (err.response?.statusCode == 401 && retryCount < _maxRetryCount) {
    // トークン再取得
    if (err.requestOptions.extra['requireToken'] == true) {
      final token = await _authService.getAccessToken();

      err.requestOptions.headers[HttpHeaders.authorizationHeader] =
          'Bearer $token';
    }

    // リトライ回数をカウントアップ
    err.requestOptions.extra['retryCount'] = retryCount + 1;

    final options = _convertOptionsFromRequestOptions(err.requestOptions);

    // リクエスト再送信
    final response = await _dio.request(
      err.requestOptions.path,
      data: err.requestOptions.data,
      options: options,
      queryParameters: err.requestOptions.queryParameters,
      cancelToken: err.requestOptions.cancelToken,
      onSendProgress: err.requestOptions.onSendProgress,
      onReceiveProgress: err.requestOptions.onReceiveProgress,
    );

    return handler.resolve(response);
  }
  return handler.next(err);
}