Flutter 网络请求王者 Dio 简介

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 窥一貌而知全部,作为网络请求框架, dio不仅简单易用。而且还具备强大的高级功能。本篇对dio做了基本的介绍以及获取列表数据的示例。
在 Flutter 中,要说网络请求插件,不得不提 dio,而且这是国人开发的开源插件,在 pub 上好评率达到99%,GitHub 也收获了近万star。借用官方文档的一句话描述:dio是一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时、自定义适配器等...可以说是覆盖了所有涉及到的网络请求。

前期准备

要开始网络请求部分了,验证接口请求是个麻烦事, 单纯的测试 CRUD 请求倒还好,可以使用 JsonPlaceholder这样的工具来完成(国内访问有点慢)。如果要弄一个完整的 App,则需要有后端搭配,要是不懂后端就麻烦了,只能实用 Mock 工具了。
作为要成为全栈的同学来说,怎么能Mock 就算了呢,不会写,咱还不会淘啊!GitHub 走一圈,找到了一个基于 Express.js 框架的 api 源码,是一个老外写的,看了看,发现也不太难懂, 生搬硬套改呗!

生搬硬套

后台源码我已经上传了,大家可以自行看,如果不想看的,直接按文档配置好环境, 在目录下执行一下命令 node index.js就可以启动本地服务,监听的 api 地址在:http://localhost:3900/api/。想自己改的,需要具备以下知识(努力学吧,少年!)

  • MongoDB:后台数据库使用的是 MongoDB,采用 mongoose 实现的 MongoDB 访问,基本的 MongoDB 操作要会。
  • Javascript:JS 不会,肯定玩不转,不过Dart 和 JS 很像,学起来不会怎么费劲。

你好,dio

dio 这个名字就很中国化(按拼音读你就懂了,也可能是我想歪了,原意可能是 Dart IO 的缩写吧)。dio目前最新的版本已经是4.0.6了。先来看基本的 get,post,put,patch,delete 请求的写法。
get请求

Response response;
var dio = Dio();
response = await dio.get('/test?id=12&name=wendu');
print(response.data.toString());
// 也可以实用 query 参数的方式请求
response = await dio.get('/test', queryParameters: {'id': 12, 'name': 'wendu'});
print(response.data.toString());

post 请求

response = await dio.post('/test', data: {'id': 12, 'name': 'wendu'});

patch、put 请求

var result = await Dio().patch('/test/12', data: data);
var result = await Dio().put('/test/12', data: data);

delete请求

var result = await Dio().delete('/test/12');

使用起来也比较简单,返回的 result 会包括的 http 请求的状态码,信息,header 和响应数据,其中响应数据在 data 属性里面。

小试牛刀

之前介绍了Flutter 图文并茂的列表实现,之前的数据是我们的 Mock 数据,现在修改成从网络上获取,接口已经准备好了,为:http://localhost:3900/api/dynamics,支持传入分页参数进行分页。为了简单起见,只返回了分页数据,没有返回分页信息。
注:可以在后台工程目录下运行 **_node seed.js_** 生成数据库数据。

在 pubspec.yaml 中加入 dio 的依赖:

dio: ^4.0.6

实体类准备
为了避免实用 Map 的key 下标访问,我们准备一个实体类 DynamicEntity,将 Map 数据转换为实体对象。

class DynamicEntity {
  String _title;
  String _imageUrl;
  int _viewCount;
  String _id;

  get title => _title;
  get imageUrl => _imageUrl;
  get viewCount => _viewCount;
  get id => _id;

  static DynamicEntity fromJson(Map<String, dynamic> json) {
    DynamicEntity newEntity = DynamicEntity();
    newEntity._id = json['_id'];
    newEntity._title = json['title'];
    newEntity._imageUrl = json['imageUrl'];
    newEntity._viewCount = json['viewCount'];

    return newEntity;
  }
}

接口请求类
新建一个接口请求类DynamicService,将动态涉及到的网络请求统一放入该类调用,里面的方法均定义为静态方法,避免需要实例化对象来请求,目前我们只验证列表接口,这里也没有做错误和异常处理。

import 'package:dio/dio.dart';

class DynamicService {
  static String host = 'http://localhost:3900/api/';
  static Future list(page, pageSize) async {
    var result = await Dio().get(
      host + 'dynamics',
      queryParameters: {'page': page, 'pageSize': pageSize},
    );

    return result;
  }
}

修改原有 Mock 数据为网络请求

我们之前的Mock 数据就是仿照 API 接口做的,因此换起来很方便,可以对比一下代码:

//使用Mock数据
void _requestNewItems() async {
    List<Map<String, dynamic>> _jsonItems =
        await DynamicMockData.list(_currentPage, PAGE_SIZE);
    List<DynamicEntity> _newItems =
        _jsonItems.map((json) => DynamicEntity.fromJson(json)).toList();
    this.setState(() {
      if (_currentPage > 1) {
        _listItems += _newItems;
      } else {
        _listItems = _newItems;
      }
    });
  }

// 更换为网络请求后
void _requestNewItems() async {
    var response = await DynamicService.list(_currentPage, PAGE_SIZE);
    List<dynamic> _jsonItems = response.data;
    List<DynamicEntity> _newItems =
        _jsonItems.map((json) => DynamicEntity.fromJson(json)).toList();
    this.setState(() {
      if (_currentPage > 1) {
        _listItems += _newItems;
      } else {
        _listItems = _newItems;
      }
    });
  }

实际开发过程中,可以让 Mock 数据类和真实的接口类实现相同的接口,这样就可以只需要替换接口的实现类就可以了,也就是常说的面向接口编程

跑起来

修改完成后,直接运行代码,效果如下所示,可以看到 id 已经发生了改变。
屏幕录制2021-06-30 下午9.44.44.gif

总结

本篇简单介绍了 dio ,以及get 请求完成了列表数据的获取,窥一貌而知全部,可以看到 dio 的简单易用。后续将陆续介绍其他的请求以及更为高级的用法,来见证 dio 的强大之处。


欢迎关注个人公众号:岛上码农

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
5月前
|
机器学习/深度学习
【从零开始学习深度学习】33.语言模型的计算方式及循环神经网络RNN简介
【从零开始学习深度学习】33.语言模型的计算方式及循环神经网络RNN简介
【从零开始学习深度学习】33.语言模型的计算方式及循环神经网络RNN简介
|
4天前
|
存储 缓存 Dart
Flutter&鸿蒙next 封装 Dio 网络请求详解:登录身份验证与免登录缓存
本文详细介绍了如何在 Flutter 中使用 Dio 封装网络请求,实现用户登录身份验证及免登录缓存功能。首先在 `pubspec.yaml` 中添加 Dio 和 `shared_preferences` 依赖,然后创建 `NetworkService` 类封装 Dio 的功能,包括请求拦截、响应拦截、Token 存储和登录请求。最后,通过一个登录界面示例展示了如何在实际应用中使用 `NetworkService` 进行身份验证。希望本文能帮助你在 Flutter 中更好地处理网络请求和用户认证。
116 1
|
4天前
|
网络协议 安全 算法
网络空间安全之一个WH的超前沿全栈技术深入学习之路(9):WireShark 简介和抓包原理及实战过程一条龙全线分析——就怕你学成黑客啦!
实战:WireShark 抓包及快速定位数据包技巧、使用 WireShark 对常用协议抓包并分析原理 、WireShark 抓包解决服务器被黑上不了网等具体操作详解步骤;精典图示举例说明、注意点及常见报错问题所对应的解决方法IKUN和I原们你这要是学不会我直接退出江湖;好吧!!!
网络空间安全之一个WH的超前沿全栈技术深入学习之路(9):WireShark 简介和抓包原理及实战过程一条龙全线分析——就怕你学成黑客啦!
|
5月前
|
机器学习/深度学习
【从零开始学习深度学习】37. 深度循环神经网络与双向循环神经网络简介
【从零开始学习深度学习】37. 深度循环神经网络与双向循环神经网络简介
|
4天前
|
网络协议 安全 算法
网络空间安全之一个WH的超前沿全栈技术深入学习之路(9-2):WireShark 简介和抓包原理及实战过程一条龙全线分析——就怕你学成黑客啦!
实战:WireShark 抓包及快速定位数据包技巧、使用 WireShark 对常用协议抓包并分析原理 、WireShark 抓包解决服务器被黑上不了网等具体操作详解步骤;精典图示举例说明、注意点及常见报错问题所对应的解决方法IKUN和I原们你这要是学不会我直接退出江湖;好吧!!!
|
22天前
|
JSON Dart 数据格式
flutter:文件操作与网络请求 (十五)
本文介绍了 Dart 语言中文件操作与网络请求的相关知识,包括 Future 的使用、异步请求的处理以及 async 和 await 的应用。通过示例代码展示了如何实现延时操作、处理网络请求及解析 JSON 数据。
|
4月前
|
JSON Dart API
Flutter dio http 封装指南说明
本文介绍了如何实现一个通用、可重构的 Dio 基础类,包括单例访问、日志记录、常见操作封装以及请求、输出、报错拦截等功能。
102 2
Flutter dio http 封装指南说明
|
3月前
|
网络协议 安全 网络安全
网络术语、接口和协议简介
网络术语、接口和协议简介
49 1
|
3月前
|
缓存
Flutter Image从网络加载图片刷新、强制重新渲染
Flutter Image从网络加载图片刷新、强制重新渲染
100 1
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN)简介
【8月更文挑战第30天】在人工智能的浪潮中,深度学习以其强大的数据处理能力成为时代的宠儿。本文将深入浅出地介绍深度学习的一个重要分支——卷积神经网络(CNN),并探讨其如何在图像识别等领域大放异彩。通过实例,我们将一窥CNN的神秘面纱,理解其背后的原理,并探索如何利用这一工具解锁数据的深层价值。