如何防止 Dio 在成功重试后抛出错误?

Han*_*ård 0 dart dio

我正在使用 Dio 向 REST-api 发出请求。当授权令牌过期时,我刷新令牌并重新发送请求。执行此操作的代码如下所示:

onError: (DioError error, ErrorInterceptorHandler handler) async {
logger.d(errorLogString(error));

if (error.response?.statusCode == 401 && error.requestOptions.path != 'login' && _retries-- > 0) {
  await authService.refreshToken();

  error.response = await dio.request(
    error.requestOptions.path,
    data: error.requestOptions.data,
    queryParameters: error.requestOptions.queryParameters,
    options: Options(
      method: error.requestOptions.method,
      headers: error.requestOptions.headers,
    ),
  );
}

return handler.next(error);
},
Run Code Online (Sandbox Code Playgroud)

这工作正常,但即使新请求成功,Dio 仍然会抛出错误,这意味着我必须捕获并检查每个请求的状态代码。例如这样:

try {
  final response = await dio.post(
    'someUrl',
  );
  return Object.fromJson(response.data);
} catch (error) {
  if(error is DioError && (error.response?.statusCode ?? 300) < 300){
    return Object.fromJson(error.response!.data);
  }

  throw parseError(error);
}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以防止 Dio 在请求成功时完全抛出错误,或者我必须像上面那样每次都捕获错误。那么,有没有办法简化捕获错误并返回成功响应的过程呢?

ren*_*rhc 5

我知道这是一个老问题,但如果其他人像我今天一样寻找这个问题的答案,您可以使用 handler.resolve(response)

使用上面的例子:

onError: (DioError error, ErrorInterceptorHandler handler) async {
logger.d(errorLogString(error));

if (error.response?.statusCode == 401 && error.requestOptions.path != 'login' && _retries-- > 0) {
      await authService.refreshToken();

      var response = await dio.request(
        error.requestOptions.path,
        data: error.requestOptions.data,
        queryParameters: error.requestOptions.queryParameters,
        options: Options(
          method: error.requestOptions.method,
          headers: error.requestOptions.headers,
        ),
      );
      return handler.resolve(response);
    }
    return handler.next(error);
},
Run Code Online (Sandbox Code Playgroud)