dio中的请求


我们在上一章回中介绍了"如何获取时间戳"相关的内容,本章回中将介绍dio中的通用请求.闲话休提,让我们一起Talk Flutter吧。

在这里插入图片描述

1. 概念介绍

我们在前面章回中介绍了如何使用dio库发起网络请求相关的内容。从本章回开始,我们将介绍一系列关于dio中的内容,这些内容主要dio库功能的介绍,或者说知识的
细节,主要介绍的功能有get、post、path、delete这些常用的Http操作。本章回先介绍通用请求操作。

2. 使用方法

我们在这里说的通用请求操作是指dio中的request()方法,该方法可以发起任何网络请求,下面是该方法的函数原型:

  Future<Response<T>> request<T>(
    String url, {
    Object? data,
    Map<String, dynamic>? queryParameters,
    CancelToken? cancelToken,
    Options? options,
    ProgressCallback? onSendProgress,
    ProgressCallback? onReceiveProgress,
  });

在上面的函数原型中,通过url参数指定网络地址,data参数指定请求相关的数据,最重要的是options参数,通过该参数来指定Http请求的类型。我们将在后面的小节
中通过示例代码来演示它的用法。

3. 示例代码

Future<T> request<T>(String url,{
        required Map<String,dynamic> params,
      }) async {

    String method='get',
    final option = Options(method: method);

    try {
      Response response = await mdio.request(
          url, queryParameters: params, options: option);
      return response.data;
    }on DioException catch (e) {
      print(e.toString());
      return Future.error(e);
    }
  }
}

我们在上面的示例代码中把request()方法封装成了独立的方法,这样方便使用,同时我们也指定请求的类型为"get",请求的地址和参数通过方法的参数传递进来,最
终传递给request()方法。此外,代码中没有演示创建dio对象的方法,大家可以参考之前博客中的内容。

4. 内容总结

最后,我们对本章回中的内容做一个全面的总结:

  • 使用dio中的request方法可以发起各种Http请求;
  • 使用request方法中的url参数来设置请求的网络地址;
  • 使用request方法中的queryParameters参数来设置请求的参数;
  • 使用request方法中的options参数来设置请求的类型,比如"get";
    看官们,与"dio中的通用请求"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!
Flutter 中使用 Dio 实现请求数据的缓存,可以通过拦截器机制结合本地存储策略实现。Dio 本身不直接提供缓存功能,但其拦截器机制允许开发者在请求和响应过程中插入自定义逻辑,从而实现缓存控制与数据更新的分离[^3]。 ### 使用拦截器实现缓存逻辑 Dio 提供了 `Interceptor` 接口,允许在请求发出前和响应返回后执行自定义逻辑。通过拦截器,可以在请求前检查本地缓存是否存在,并在响应返回后更新缓存数据。以下是一个基础的缓存拦截器实现示例: ```dart class CacheInterceptor extends Interceptor { final Map<String, Response> _cache = {}; @override void onRequest(RequestOptions options, RequestInterceptorHandler handler) { final key = _generateKey(options); if (_cache.containsKey(key)) { final cachedResponse = _cache[key]; // 直接返回缓存数据 handler.resolve(cachedResponse!, true); } else { super.onRequest(options, handler); } } @override void onResponse(Response response, ResponseInterceptorHandler handler) { final key = _generateKey(response.requestOptions); _cache[key] = response; super.onResponse(response, handler); } String _generateKey(RequestOptions options) { return '${options.method}-${options.uri}'; } } ``` 该拦截器通过维护一个内存缓存字典 `_cache` 来保存请求结果,并在每次请求前尝试返回缓存数据。这种方式适用于简单的缓存需求,但不支持持久化存储[^4]。 ### 持久化缓存与策略控制 为了实现持久化缓存,可以结合本地数据库(如 `shared_preferences` 或 `hive`)存储响应数据。例如,使用 `shared_preferences` 存储 JSON 数据,并在拦截器中读取和写入缓存: ```dart import 'package:shared_preferences/shared_preferences.dart'; class PersistentCacheInterceptor extends Interceptor { late SharedPreferences _prefs; PersistentCacheInterceptor() { SharedPreferences.getInstance().then((prefs) { _prefs = prefs; }); } @override void onRequest(RequestOptions options, RequestInterceptorHandler handler) async { final key = _generateKey(options); final cachedData = _prefs.getString(key); if (cachedData != null) { final response = Response( data: jsonDecode(cachedData), statusCode: 200, requestOptions: options, ); handler.resolve(response, true); } else { super.onRequest(options, handler); } } @override void onResponse(Response response, ResponseInterceptorHandler handler) { final key = _generateKey(response.requestOptions); _prefs.setString(key, jsonEncode(response.data)); super.onResponse(response, handler); } String _generateKey(RequestOptions options) { return '${options.method}-${options.uri}'; } } ``` 该实现通过 `SharedPreferences` 存储和读取缓存数据,从而实现跨会话的缓存保留。同时,可以根据业务需求扩展缓存过期策略、缓存大小控制等功能[^4]。 ### 配置 Dio 实例并使用缓存拦截器 在实际项目中,通常会创建一个全局的 Dio 实例,并添加缓存拦截器,以统一处理网络请求和缓存逻辑: ```dart final dio = Dio(); dio.interceptors.add(CacheInterceptor()); ``` 若需结合持久化缓存,可将 `PersistentCacheInterceptor` 替换为上述实现。此外,还可以结合请求参数、URL 路径等信息,实现更细粒度的缓存控制,例如为不同用户或不同请求路径设置独立缓存空间[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值