dio初次实操教程DIO PRACTICE NOTES

dio初次实操教程

欢迎来到这份 dio初次实操教程的首页栏目。它把一次真实的上手过程摊开来讲:先备好 Dart 或 Flutter 工程,再写出第一个 Dio 实例,然后一路走到请求头统一、拦截器串联和错误兜底。你不需要先读完厚厚的手册,照着页面的节奏敲一遍,就能看到响应落在控制台里。

半夜的台灯下,小林第一次把 Dio 加进自己的小项目。他先别急着写业务,而是先让一个最小请求跑通——这是这份教程反复强调的起点:能跑起来,才有资格谈封装。

  • 环境准备
  • 实例与配置
  • GET / POST 实操
  • 拦截器
  • 错误处理
上手口诀:先跑通,再加头,再拦截,最后兜错。

第一步:把 Dio 请进工程

Dio 是一个运行在 Dart 与 Flutter 环境中的 HTTP 客户端,用起来像给网络请求套了一层顺手的壳。你要做的准备并不多:一个能编译的工程、一个可访问的接口地址,以及把依赖写进配置里。 打开工程的依赖文件,在依赖段落加入 Dio,版本以包管理站点当前提供的为准;随后执行依赖拉取命令,让它在本地落地。工程目录里出现新的引用记录,就说明这一步成了。

dependencies:
  dio: ^5.0.0

# 拉取依赖
# dart pub get  或  flutter pub get

导入与最小实例

在需要使用网络的文件顶部导入 Dio,然后创建实例。基地址与超时可以放在配置对象里一次性设定,后续调用就不必层层重复。

import 'package:dio/dio.dart';

final dio = Dio(BaseOptions(
  baseUrl: 'https://api.example.com',
  connectTimeout: const Duration(seconds: 5),
  receiveTimeout: const Duration(seconds: 8),
));

把实例放在一个独立文件里导出,是一个很省心的小习惯:日后换地址、加请求头,都只需要动一处。

核心实操:从一次 GET 走到完整流程

  1. 发起第一个 GET 请求

    调用实例上的方法并等待结果。响应的状态码与数据体分别落在不同字段里,取出来打印即可确认链路通畅。

    final res = await dio.get('/posts/1');
    print(res.statusCode);
    print(res.data);
  2. 提交一次 POST 数据

    需要发送负载时,把数据放进参数里。Dio 会依据内容类型自动编码,多数场景无需手工拼装请求体。

    final out = await dio.post('/posts', data: {
      'title': 'first',
      'body': 'hello dio',
    });
  3. 统一请求头

    鉴权字段、客户端标识这类内容,最好集中处理。可以写在配置对象的请求头里,也可以放进拦截器,按需增减。

    dio.options.headers['X-Client'] = 'practice-demo';
  4. 接入拦截器

    拦截器像一个关卡:请求出发前、响应回来时、出错的时候,都允许你插一手。日志、签名、刷新凭证,都可以安放在这里。

    dio.interceptors.add(InterceptorsWrapper(
      onRequest: (options, handler) {
        options.headers['X-Token'] = 'demo-token';
        return handler.next(options);
      },
      onResponse: (response, handler) {
        return handler.next(response);
      },
      onError: (err, handler) {
        return handler.next(err);
      },
    ));
  5. 为失败留一条退路

    网络世界不总是顺利。用异常捕获把错误接住,读取错误类型与响应状态,再决定是重试、提示还是静默降级。

    try {
      await dio.get('/not-found');
    } on DioException catch (e) {
      print(e.type);
      print(e.response?.statusCode);
    }

方法对照:常用调用的取舍

把常用的四个方法放在一张表里,上手时照查即可。它们共享同一套配置与拦截器,切换成本很低。

方法适合的场景最小调用
get读取列表、详情等查询类资源dio.get('/posts')
post新建记录、提交表单或数据体dio.post('/posts', data: {...})
put整体更新一条已有记录dio.put('/posts/1', data: {...})
delete删除指定资源dio.delete('/posts/1')

需要下载文件或接收纯文本时,可在配置对象里调整响应的解析方式,让返回内容按你的预期呈现。

常见问题

请求迟迟不返回,一直等着怎么办?
先检查配置对象里的连接与接收超时是否设置合理,再确认目标地址在设备上能否访问。多数“卡住”源于地址写错或网络受限。
拿到的数据不是我想要的类型
确认接口返回的内容类型与响应解析方式是否匹配。需要原始文本时显式指定按文本处理,需要对象时保持默认的 JSON 解析。
怎样给所有请求统一加请求头?
两种做法都可行:写在基础配置的请求头里,或在拦截器的请求阶段动态追加。需要按条件变化的字段,更适合放在拦截器。
拦截器和单独处理请求有什么区别?
拦截器作用于该实例下的全部请求,适合日志、鉴权这类共性逻辑;一次性、特殊的需求,直接写在单次调用里更清晰。
关闭广告,继续浏览

正在为您寻找最佳连接路径,页面正在加载...