解决 Flutter Dio合并请求多个接口,如果一个接口500,那么导致其他请求不在执行

Flutter Dio如何自定义拦截异常

应用场景

我们一般会统一拦截DioExceptionType 如400,403,500 等错误

但有时候,有个地方合并请求多个接口,如果一个接口500,那么导致其他请求不在执行,因为统一拦截了500,

修改方法在请求时加一个Header 如:isIntercep 字段,在Dio onError 时 解出这个Header来,如有这个字段返回如下,就是不拦截,这样的话只是这个接口返回数据错误,不影响其他接口执行

dart 复制代码
 handler.resolve(
        Response<Map<String, dynamic>>(
          requestOptions: err.requestOptions,
          statusCode: 200,
          data: {},
        ),

///请求公共参数拦截器
class HttpParamsInterceptor extends Interceptor {
  static const language = "language";
  static const appname = "appname";
  static const mobileType = "mobileType";
  static const mobileId = "mobileId";
  static const version = "version";

  @override
  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
    var headers = options.headers;
    headers[language] = LocaleController.getCountryCode;
    headers[mobileType] = GetPlatform.isAndroid ? "Android" : "IOS";
    headers[version] = PackageInfoManager().version;
    headers[appname] = PackageInfoManager().appName;
    if (AppConfig.instance.enableRequestJsonLog) {
      Log.r(
          '${"--------------------onRequest---------------"}\n${options.method}${' Url:'} ${options.uri}\n${'Query Parameters:'}${options.queryParameters}\n${'Body:'}${options.data != null ? const JsonEncoder.withIndent('  ').convert(options.data) : ""}\n\n');
    }
    super.onRequest(options, handler);
  }

  @override
  void onResponse(Response response, ResponseInterceptorHandler handler) {
    if (AppConfig.instance.enableResponseJsonLog) {
      Log.r(
          '${"-----------------------------Response Start-----------------------------"}\n${response.requestOptions.method}${' Url:'} ${response.requestOptions.uri}\n${'Query Parameters:'}${response.requestOptions.queryParameters}\n${'Body:'}${response.requestOptions.data != null ? const JsonEncoder.withIndent('  ').convert(response.requestOptions.data) : ""}\n${'response data:'}\n$response\n\n${"-----------------------------Response End-------------------------------"}\n\n\n');
    }
    super.onResponse(response, handler);
  }

  @override
  Future<void> onError(
      DioException err, ErrorInterceptorHandler handler) async {
    AppException appException = AppException.create(err);
    if (AppConfig.instance.enableRequestLog) {
      Log.e('DioException===: +${err.toString()}');
    }
    Log.logPrint(err.requestOptions.headers);
    Log.logPrint(appException.type);
    Map<String, dynamic> data = err.requestOptions.headers;
    bool? isIntercep = data[APIConstant.ignoreIntercep];
    if (isIntercep == true &&
        (appException.type == DioExceptionType.badResponse ||
            appException.type == DioExceptionType.unknown)) {
      return handler.resolve(
        Response<Map<String, dynamic>>(
          requestOptions: err.requestOptions,
          statusCode: 200,
          data: {},
        ),
      );
    }

    return handler.next(appException);
  }
}
相关推荐
Nerd(BUG版)6 小时前
Flutter学习day5--事件手势与命中测试
学习·flutter
传奇开心果10 小时前
【Flutter踩坑排雷】第5课:扩展方法冲突坑|同名扩展引发编译歧义,故障规避手段
android·flutter
雪铃儿1 天前
Flutter 双端热更新新方案:基于 Dart 官方动态模块的 flutter_patcher 1.0.0
flutter·hotfix
好的佩奇2 天前
Dart 之方法、操作符与可调用对象
android·flutter·dart
恋猫de小郭2 天前
Flutter Impeller Vulkan 内存持续上涨,问题没想到是文字阴影
android·前端·flutter
传奇开心果2 天前
【Flutter踩坑排雷】第3课:const 误用坑|const 错误使用引发 UI 异常与性能损耗
android·flutter
行者-全栈开发2 天前
Flutter 插件 device_calendar_plus 开源鸿蒙适配实战:从权限弹窗失灵到循环日程跑通
flutter·跨平台·harmonyos·arkts·日历·适配·开源鸿蒙
恋猫de小郭3 天前
Flutter 开始支持 Jetpack Compose Platform View
android·前端·flutter
SoaringHeart3 天前
Flutter 查缺补漏:@JsonKey 属性全解,让模型层不再被后端字段牵着走
flutter