返回

Dio网络请求框架之 Interceptor、_InterceptorWrapperMixin、InterceptorsWrapper 源码解析(七)

前端

Interceptor 的原理

Interceptor 是 Dio 的核心拦截机制,它是一个抽象类,定义了拦截器的基本行为。拦截器可以通过实现 Interceptor 接口来实现自定义的拦截逻辑。

Interceptor 中定义了三个方法:

  • onRequest:在请求发送之前调用。
  • onResponse:在收到响应之后调用。
  • onError:在请求发生错误时调用。

拦截器可以通过覆盖这三个方法来实现自定义的拦截逻辑。例如,可以实现一个拦截器来记录请求和响应的信息,或者实现一个拦截器来处理重定向。

_InterceptorWrapperMixin 的作用

_InterceptorWrapperMixin 是一个混入类,它为 Interceptor 提供了额外的功能。_InterceptorWrapperMixin 中定义了两个方法:

  • apply:将拦截器应用到请求。
  • clear:清除拦截器。

_InterceptorWrapperMixin 的作用是将 Interceptor 应用到请求并清除拦截器。

InterceptorsWrapper 的作用

InterceptorsWrapper 是一个类,它管理一组 Interceptor。InterceptorsWrapper 中定义了以下方法:

  • add:向 InterceptorsWrapper 中添加一个 Interceptor。
  • remove:从 InterceptorsWrapper 中移除一个 Interceptor。
  • clear:清除所有 Interceptor。
  • apply:将所有 Interceptor 应用到请求。

InterceptorsWrapper 的作用是管理 Interceptor 并将 Interceptor 应用到请求。

拦截器的使用

拦截器可以通过以下方式使用:

  1. 创建一个 Interceptor 实例。
  2. 将 Interceptor 实例添加到 InterceptorsWrapper 中。
  3. 将 InterceptorsWrapper 应用到请求。

例如,以下代码演示了如何创建一个简单的拦截器来记录请求和响应的信息:

class LoggingInterceptor extends Interceptor {
  @override
  Future<RequestOptions> onRequest(RequestOptions options) async {
    print('Request: ${options.method} ${options.path}');
    return options;
  }

  @override
  Future<Response<T>> onResponse<T>(Response<T> response) async {
    print('Response: ${response.statusCode} ${response.data}');
    return response;
  }

  @override
  Future<Response<T>> onError<T>(DioError err) async {
    print('Error: ${err.message}');
    return err.response;
  }
}

然后,可以通过以下代码将 LoggingInterceptor 添加到 InterceptorsWrapper 中:

InterceptorsWrapper interceptors = InterceptorsWrapper();
interceptors.add(LoggingInterceptor());

最后,可以通过以下代码将 InterceptorsWrapper 应用到请求:

Dio dio = Dio();
dio.interceptors.add(interceptors);

现在,每次使用 Dio 发送请求时,LoggingInterceptor 都会被调用,并会将请求和响应的信息打印到控制台。

总结

拦截器是 Dio 中一个强大的功能,它可以用来实现各种自定义的拦截逻辑。通过使用拦截器,我们可以轻松地扩展 Dio 的功能,并使其能够满足各种不同的需求。