一文带你掌握Flutter dio网络请求库的封装


highlight: an-old-hope

封装网络库考虑的几个方面:

请求参数的封装:

将请求所需的参数进行封装,例如 URL、请求头、请求体等。可以定义一个统一的数据结构或模型类来表示请求参数,以便于传递和管理。

响应结果的封装:

将网络请求返回的响应结果进行封装,例如状态码、响应头、响应体等。同样,可以定义一个统一的数据结构或模型类来表示响应结果,以便于处理和解析。

错误处理的封装:

对网络请求可能出现的错误进行封装和处理,例如网络连接失败、超时、服务器错误等。可以定义自定义的异常类或错误码,以及相应的错误处理机制。

拦截器的封装:

如果第三方网络库支持拦截器机制,你可以封装拦截器,用于在请求发起前或响应返回后进行额外的处理,如添加身份验证、日志记录等。

封装示例

/** @Author: HaiJun* @FilePath: \flutter_demo_show\lib\utils\http.dart* @Description: * */
import 'package:dio/dio.dart';
import './CustomInterceptor.dart';class HttpApi {// 配置基本的请求选项static final BaseOptions options = BaseOptions(baseUrl: 'http://localhost:3001/', // 设置请求的基础 URLmethod: 'GET', //默认请求方法connectTimeout: const Duration(seconds: 5), // 设置连接超时时间为 5 秒receiveTimeout: const Duration(seconds: 3), // 设置接收超时时间为 3 秒headers: {'User-Agent': 'Dio', // 设置请求头信息},);static Dio dio = Dio(options);static Future<T> request<T>(String url,{String method = "get", Map<String, dynamic>? params}) async {// 1请求的单独配置final options = Options(method: method);// 2 添加一个拦截器Interceptor inter = InterceptorsWrapper(onRequest: (options, handler) {return handler.next(options);},onResponse: (e, handler) {print(e);return handler.next(e);},onError: (e, handler) {print(e);return handler.next(e);},);List<Interceptor> inters = [];inters.add(CustomInterceptor()); //添加自定义拦截器inters.add(LogInterceptor()); //添加内置拦截器dio.interceptors.addAll(inters);// 3 发起网络请求try {Response response =await dio.request<T>(url, queryParameters: params, options: options);print("测试");print(url);return response.data;} catch (e) {print(e);return Future.error(e);}}
}

调用请求

把封装好的文件导入进来,

import 'package:flutter/material.dart';
import 'utils/http.dart';class MyNetwork extends StatefulWidget {const MyNetwork({super.key});@overrideState<MyNetwork> createState() => _MyNetworkState();
}class _MyNetworkState extends State<MyNetwork> {void getData() async {print("发起请求");var responseData = await HttpApi.request('book');print(responseData);}@overrideWidget build(BuildContext context) {return Container(child: Column(children: [ElevatedButton(onPressed: () {getData();},child: const Text("发起请求"))]));}
}

utils/http.dart文件中,我们封装了 dio ,创建了dio示例,传入了默认配置项,并且绑定了拦截器,在发起请求时,也会走请求拦截器,看参数是否合法,后会进入响应拦截器,状态码是否对以及不同状态码返回不同内容,最后将返回结果数据抛给客户端响应。

utils/http.dart文件中, 有一个 request异步 静态(static)方法,它提供了请求时需要填的必填参数和可选参数,当我们使用时,可以通过 类名.方法名 即可调用发起请求了。

请求返回内容

最后

❤️关注+点赞+收藏+评论+转发❤️,原创不易,鼓励笔者创作更好的文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/583580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

源码解析:mybatis调用链之获取sqlSession

SqlSession 通过SqlSession sqlSession sqlSessionFactory.openSession();获取SqlSession实例&#xff0c; DefaultSqlSessionFactory public SqlSession openSession() {return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);}//从数据…

蓝牙物联网智能安防系统设计方案

1概述 安防系统(安全防护)的作用是预防损失&#xff0c;是人们保障人身和财产安全最重要的工具之一。近年来&#xff0c;伴随经济的飞速发展和城市人口的急剧增加&#xff0c;盗窃、入室抢劫等事件的增多给人们的安定生活带来了很大的影响&#xff0c;同时&#xff0c;交通的快…

安装DataEase(Linux线上安装)修改端口

问题一&#xff1a;端口更改 警告本解决方法仅仅应急&#xff0c;如果找到了更好的方法请通知我&#xff0c;感谢你的理解&#xff01;&#xff01;&#xff01; 为了让mysql与dataease的端口不发生冲突&#xff0c;将 MySQL 外部运行端口参数 ${DE_MYSQL_PORT} 改为新端口&am…

鹏城杯2023初赛 Reverse WriteUp

一. 安全编程 rust逆向&#xff0c;直接动调 定位关键函数sub_7FD043E88C70 下断点跟进 观察控制台 guess number plz input 1-10 number 这时我们随便输入一个数&#xff0c;往下跟进 .text:00007F14B3684E9B .text:00007F14B3684E9B loc_7F14B3684E9B: .text:00007F14B…

拓扑排序笔记

这段代码通过拓扑排序对有向无环图进行排序。它创建了一个图结构&#xff0c;其中包含节点、邻接表和入度数组。然后&#xff0c;通过输入添加了一些边&#xff0c;创建了图的结构。接着&#xff0c;使用拓扑排序算法对图进行排序&#xff0c;并将排序后的结果打印输出。 首先…

C++如何获取随机浮点数

在C中&#xff0c;可以使用标准库中的<random>头文件来生成随机浮点数。以下是一个简单的例子&#xff1a; #include <iostream> #include <random>int main() {// 创建一个随机数生成器对象std::random_device rd;std::mt19937 gen(rd());// 创建一个均匀分…

使用FFmpeg进行录屏

不用下载那些录屏软件&#xff0c;安装了FFmpeg的话&#xff0c;直接实现 使用FFmpeg进行屏幕录制可以通过以下步骤实现&#xff1a; 安装FFmpeg&#xff1a;首先需要在您的系统上安装FFmpeg。可以通过包管理器&#xff08;如apt、yum等&#xff09;或从官方网站下载并编译安装…

openGauss学习笔记-176 openGauss 数据库运维-实例主备切换

文章目录 openGauss学习笔记-176 openGauss 数据库运维-实例主备切换176.1 操作场景176.2 操作步骤176.3 示例176.4 错误排查176.5 异常处理 openGauss学习笔记-176 openGauss 数据库运维-实例主备切换 176.1 操作场景 openGauss在运行过程中&#xff0c;数据库管理员可能需要…

linux卸载小皮面板phpstudy教程

千万不要直接删文件夹! 千万不要直接删文件夹! 千万不要直接删文件夹! 我就是按照网上搜索的教程,直接删了,然后 系统就不停的崩溃 生成这种文件: -rw------- 1 root root 223M Dec 28 22:36 core.31544 -rw------- 1 root root 223M Dec 28 18:04…

基于elemen二次封装弹窗组件

效果&#xff1a; 一、自定义内容类型弹窗 <!-- title&#xff1a;对话框的标题confirmLoading&#xff1a;当前是否处于提交中titleCenter&#xff1a;对话框标题居中方式footerCenter&#xff1a;底部按钮的对其方式visible&#xff1a;是否显示弹窗width&#xff1a;设置…

【机器学习】Boosting算法-AdaBoost算法

一、AdaBoost理论 随机森林与AdaBoost算法的比较 AdaBoost算法 AdaBoost模型训练误差分析 从广义加法模型推导出AdaBoost训练算法&#xff0c;从而给出AdaBoost算法在理论上的解释 各种AdaBoost算法对比 标准AdaBoost算法只能用于二分类问题&#xff0c;它的改进型可以用于多分…

泽攸科技PECVD设备助力开发新型石墨烯生物传感器

近日&#xff0c;松山湖材料实验室许智团队与清华大学符汪洋合作在纳米领域头部期刊《Small》上发表了一项引人注目的研究成果&#xff0c;题为“Ultrasensitive biochemical sensing platform enabled by directly grown graphene on insulator”&#xff08;硅晶圆上直接生长…

Seatunnel MYSQL数据同步

Seatunnel MYSQL数据同步 Docker镜像 Seatunnel Docker image镜像制作-CSDN博客 数据库表 #source库 CREATE TABLE IF NOT EXISTS student(id INT UNSIGNED AUTO_INCREMENT,name VARCHAR(100) NOT NULL,age int unsigned,gender char(8) NOT NULL,PRIMARY KEY ( id ) )ENGINE…

监控易:智能告警管理,让运维无忧

监控易&#xff0c;一款卓越的运维管理工具&#xff0c;以其出色的告警中心功能帮助用户有效应对各类设备告警信息&#xff0c;保障企业IT系统的稳定运行。以下是对监控易告警中心功能的详细介绍。 一、实时告警管理&#xff0c;让设备状态尽在掌控 监控易的告警中心以列表形式…

H5移动端使用html2canvas点击按钮生成图片并下载

需求&#xff1a;点击按钮下载当前页的图片 可以用html2canvas生成canvas&#xff0c;再由canvas生成base64图片 npm install html2canvas --save import html2canvas from "html2canvas"; 遇到的问题 在保存的时候会遇到图片模糊的问题。 解决方案&#xff1a…

基于Java SSM框架实现艺诚美业美容美发管理系统项目【项目源码+论文说明】

基于java的SSM框架实现艺诚美业美容美发管理系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们…

node fs模块读取文件 readFile、readFileSync、fsPromises.readFile、createReadStream

文章目录 1.读取文件1.1 readFile1.2 readFileSync1.3 fsPromises.readFile&#xff1a;promise的写法1.4 fs.createReadStream 1.读取文件 readFile&#xff1a;异步读取文件readFileSync&#xff1a;同步读取文件fsPromises.readFile&#xff1a;promise的写法 需要注意的是…

为什么ChatGPT采用SSE协议而不是Websocket?

在探索ChatGPT的使用过程中&#xff0c;我们发现GPT采用了流式数据返回的方式。理论上&#xff0c;这种情况可以通过全双工通信协议实现持久化连接&#xff0c;或者依赖于基于EventStream的事件流。然而&#xff0c;ChatGPT选择了后者&#xff0c;也就是本文即将深入探讨的SSE&…

多账号统一登录,如何设计

多账号统一登录是一种常见的需求&#xff0c;特别是在大型应用或平台中。设计一个多账号统一登录系统需要考虑以下几个方面&#xff1a; 1. 用户标识&#xff1a;每个用户在系统中应有唯一的标识&#xff0c;可以是用户名、邮箱、手机号等。这些标识应该与账号信息关联&#x…

MC17XS6500 高边驱动芯片寄存器的介绍

本文主要是对 MC17XS6500 高边驱动芯片寄存器进行的介绍&#xff0c;MC17XS6500 寄存器分为输入寄存器和输出寄存器&#xff0c;对常用的几个输入和输出寄存器的功能和配置进行了介绍。本文中&#xff0c;世平集团基于 FlagChips FC7300 HV BMS 方案&#xff0c;对 MC17XS6500 …