[Flutter3] 记录Dio的简单封装(一)

文章目录

  • 效果
  • 使用
  • ResponseEntity类
  • DioManager封装
    • _onResponse / _onDioException 的设计
    • Response的处理
    • catch处理

效果

请求成功/失败/异常的日志输出效果
成功:
在这里插入图片描述
失败:500
在这里插入图片描述
失败:404
在这里插入图片描述
网络异常:
在这里插入图片描述

使用

举个使用的例子, 在调用 DioManager的时候, 直接通过返回值的状态, 来处理各个情况,不用在 try{}catch{}里面各写一遍处理逻辑,

比如上图,就是直接调用的封装的API

      ResponseEntity res = await DioManager().requestGet(HttpApi.user_record, param: {"openid": "okqbz5K-4UoymmukFtxyQAyImKm0","uid": "88030","subject": '20',"unionid": "ofJJv6M45ChFhuUZyVaLXwt07M4g",});res.toLog();

直接同步获取了请求的结果,通过 ResponseEntity 来处理本次请求的各项情况(如上4图)

ResponseEntity类

提供了 泛型T的data属性,
提供了 tag, 用于处理请求的不同情况
提供了 toString/ toLog函数 , 用于查看请求/返回/状态码/请求参数等


class ResponseEntity<T> {/// 常规的response.data的返回字段late String? msg;late int? code;T? data;/// response.data中,自定以追加的一些字段(方便日志查看)late int? tag; // 业务tag  0=>通信OK+业务未跑通 1=>通信OK+业务跑通  2=>通信失败(各类原因...) 9=>解析/socket等异常late String? method; // 请求的 methodlate String? baseUrl; // 请求的host地址 - 方便打印日子产看环境late String? path; // 请求地址late String? desc; // 自定义的报文描述-便于判断请求情况late Map<String, dynamic>? queryParameters; // 请求的参数ResponseEntity(this.code, this.msg, this.data, this.tag, this.method, this.baseUrl, this.path, this.desc, this.queryParameters);ResponseEntity.initFromJson(Map<String, dynamic> jsonMap) {code = jsonMap.containsKey(ConstantUtil.code) ? jsonMap[ConstantUtil.code] as int? : 0;msg = jsonMap.containsKey(ConstantUtil.msg) ? jsonMap[ConstantUtil.msg] as String? : "";// 存在dataif (jsonMap.containsKey(ConstantUtil.data)) {data = jsonMap[ConstantUtil.data] as T;}/// response自定以追加的一些字段处理tag = jsonMap.containsKey(ConstantUtil.tag) ? jsonMap[ConstantUtil.tag] : 9;method = jsonMap.containsKey(ConstantUtil.method) ? jsonMap[ConstantUtil.method] : "";baseUrl = jsonMap.containsKey(ConstantUtil.baseUrl) ? jsonMap[ConstantUtil.baseUrl] : "";path = jsonMap.containsKey(ConstantUtil.path) ? jsonMap[ConstantUtil.path] : "";queryParameters = jsonMap.containsKey(ConstantUtil.queryParameters) ? jsonMap[ConstantUtil.queryParameters] : null;desc = jsonMap.containsKey(ConstantUtil.desc) ? jsonMap[ConstantUtil.desc] : "";}/// 手动重写toString 方法,方便查看日志String toString() {var _code = "code:$code\n";var _msg = "msg:$msg\n";var _data = json.encode(data).toString();var _dataString = "data:$_data\n";var _tag = "tag:$tag\n";var _method = "method:$method\n";var _baseUrl = "baseUrl:$baseUrl\n";var _path = "path:$path\n";var _desc = "path:$desc\n";var _queryParameters = jsonEncode(queryParameters);var _queryParametersString = "queryParameters:$_queryParameters\n";return _code + _msg + _dataString + _tag + _method + _baseUrl + _path + _desc + _queryParametersString;}/// 提供自带的打印函数void toLog() {LoggerUtil().d(toString());}
}

DioManager封装

对DioManager进行单例模式处理

  /// dio管理类的单例的实现 --------------------------------------------------// 定义私有管理对象 _singletonstatic final DioManager _singleton = DioManager._();// 私有对象构造实现DioManager._() {// dio初始化 - 配置全局options - 具体事项先省略}// 声明并完成初始化的私有变量(_singleton),// 通过 DioManager的工厂函数(factory关键字) ,进行单例模式返回factory DioManager() => _singleton;

提供_request通用方法

 /// request 通用处理函数 -----------------------------------------------------------/// get 对应的是 queryParam/// post 对应的是 data/// 通过 对 try/catch 的处理, 均异步返回有效的 BaseResponseEntity<T> 实例,/// 外部调用时候,仅获取数据是, 可以不必包裹 try/catch,Future<ResponseEntity<T>> _request<T>(String method,String apiPath, {Map<String, dynamic>? param,CancelToken? cancelToken,Options? options,}) async {try {// 通用请求Response<dynamic> response = await _dio.request(apiPath,data: param, queryParameters: param, cancelToken: cancelToken, options: _loadOptions(method, options));// 通过 _onResponse()函数转换response// 自定义返回的data内容, 除了原有的 code/msg/data信息, 新增desc/tag等返回数据response = _onResponse(response);return ResponseEntity<T>.initFromJson(response.data);} on DioException catch (err) {// 通过对DioException的解析,返回自定义的BaseResponseEntity实例return _onDioException(err) as ResponseEntity<T>;}}

_onResponse / _onDioException 的设计

根据Request的情况, 把交互场景分为了四类

1&2: statusCode == 200 , 再区分业务code是否OK
3: statusCode !==200, 可能是 404 /500 等情况
4: 断网等异常情况

其中 1&2&3, 都是通过_onResponse处理
4通过_onDioException处理, 这里的catch不再直接抛出, 用ResponseEntity来统一做返回格式处理
(DioException)

Response的处理

class ResponseEntity<T> {/// 常规的response.data的返回字段late String? msg;late int? code;T? data;/// response.data中,自定以追加的一些字段(方便日志查看)late int? tag; // 业务tag  0=>通信OK+业务未跑通 1=>通信OK+业务跑通  2=>通信失败(各类原因...) 9=>解析/socket等异常late String? method; // 请求的 methodlate String? baseUrl; // 请求的host地址 - 方便打印日子产看环境late String? path; // 请求地址late String? desc; // 自定义的报文描述-便于判断请求情况late Map<String, dynamic>? queryParameters; // 请求的参数ResponseEntity(this.code, this.msg, this.data, this.tag, this.method, this.baseUrl, this.path, this.desc, this.queryParameters);ResponseEntity.initFromJson(Map<String, dynamic> jsonMap) {code = jsonMap.containsKey(ConstantUtil.code) ? jsonMap[ConstantUtil.code] as int? : 0;msg = jsonMap.containsKey(ConstantUtil.msg) ? jsonMap[ConstantUtil.msg] as String? : "";// 存在dataif (jsonMap.containsKey(ConstantUtil.data)) {data = jsonMap[ConstantUtil.data] as T;}/// response自定以追加的一些字段处理tag = jsonMap.containsKey(ConstantUtil.tag) ? jsonMap[ConstantUtil.tag] : 9;method = jsonMap.containsKey(ConstantUtil.method) ? jsonMap[ConstantUtil.method] : "";baseUrl = jsonMap.containsKey(ConstantUtil.baseUrl) ? jsonMap[ConstantUtil.baseUrl] : "";path = jsonMap.containsKey(ConstantUtil.path) ? jsonMap[ConstantUtil.path] : "";queryParameters = jsonMap.containsKey(ConstantUtil.queryParameters) ? jsonMap[ConstantUtil.queryParameters] : null;desc = jsonMap.containsKey(ConstantUtil.desc) ? jsonMap[ConstantUtil.desc] : "";}/// 手动重写toString 方法,方便查看日志String toString() {var _code = "code:$code\n";var _msg = "msg:$msg\n";var _data = json.encode(data).toString();var _dataString = "data:$_data\n";var _tag = "tag:$tag\n";var _method = "method:$method\n";var _baseUrl = "baseUrl:$baseUrl\n";var _path = "path:$path\n";var _desc = "path:$desc\n";var _queryParameters = jsonEncode(queryParameters);var _queryParametersString = "queryParameters:$_queryParameters\n";return _code + _msg + _dataString + _tag + _method + _baseUrl + _path + _desc + _queryParametersString;}/// 提供自带的打印函数void toLog() {LoggerUtil().d(toString());}
}

catch处理

  /// 对 DioException进行解析,基本覆盖大部分错误类型了ResponseEntity _onDioException(DioException err) {var errType = err.type;var path = err.requestOptions.path;var data = err.requestOptions.data;var queryParameters = err.requestOptions.queryParameters;var baseUrl = err.requestOptions.baseUrl;var method = err.requestOptions.method;ResponseEntity baseResponseEntity = ResponseEntity(0, "", data, 9, method, baseUrl, path, "", queryParameters);///连接超时if (errType == DioExceptionType.connectionTimeout) {baseResponseEntity.msg = "连接超时";baseResponseEntity.desc = "连接超时";}///发送超时if (errType == DioExceptionType.sendTimeout) {baseResponseEntity.msg = "发送超时";baseResponseEntity.desc = "发送超时";}///接收超时if (errType == DioExceptionType.receiveTimeout) {baseResponseEntity.msg = "接收超时";baseResponseEntity.desc = "接收超时";}///证书损坏if (errType == DioExceptionType.badCertificate) {baseResponseEntity.msg = "证书损坏";baseResponseEntity.desc = "证书损坏";}///返回内容问题if (errType == DioExceptionType.badResponse) {baseResponseEntity.msg = "返回内容问题";baseResponseEntity.desc = "返回内容问题";}///请求取消if (errType == DioExceptionType.cancel) {baseResponseEntity.msg = "请求取消";baseResponseEntity.desc = "请求取消";}///连接错误-无网络if (errType == DioExceptionType.connectionError) {baseResponseEntity.msg = "连接错误-无网络";baseResponseEntity.desc = "连接错误-无网络";}///未知错误if (errType == DioExceptionType.unknown) {baseResponseEntity.msg = "未知错误";baseResponseEntity.desc = "未知错误";}return baseResponseEntity;}

针对ResponseEntity中, T? data 的处理, 稍后补上, 先走通请求…

— 数据转模型看这个
[Flutter3] Json转dart模型举例

对于泛型T的处理, 直接把 json转model的model类型传入泛型就可获取数据

在这里插入图片描述

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

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

相关文章

Qt 把.exe打包成安装文件形式

目录 1.下载工具 Qt Installer Framework2.将bin文件添加到环境变量3.拷贝startmenu示例-备用4.准备Qt Release打包好的程序5.把Release打包好的程序放到packages\org.qtproject.ifw.example\data文件夹下6.生成安装包7.修改安装包图标8.修改主程序程序安装引导-创建快捷键9.添…

Linux---自定义协议

应用层协议 一、协议定制---以网络计算器为例 网络计算机功能---进行-*/^&|的运算并返回结果 请求和响应的结构体如下 // Protocol.hpp #pragma once #include <iostream> #include <memory> class Request { public:Request(){}Request(int data_x, int da…

苹果AI终于来了!从2.7到30亿四款大模型代码全开源,AI技术持续“狂飙”|钛媒体AGI

&#xff08;图片来源&#xff1a;Apple官网&#xff09; 苹果公司突然公布了一则大新闻。 北京时间4月25日凌晨&#xff0c;苹果在 Hugging Face 平台上发布一个“具有开源训练和推理框架的高效语言模型”&#xff0c;名为 OpenELM。 据了解&#xff0c;OpenELM有四种尺寸&…

Magnet for Mac:高效窗口管理工具

Magnet for Mac是一款专为Mac用户设计的窗口管理工具&#xff0c;旨在帮助用户更高效地管理和布局多个应用程序窗口&#xff0c;提升工作效率。 Magnet for Mac v2.14.0中文免激活版下载 这款软件拥有直观易用的界面和丰富的功能&#xff0c;支持用户将屏幕分割成多个区域&…

Linux操作系统的安装与配置

目录 (1)实验目的&#xff1a; (2)实验内容&#xff1a; (3)实验原理&#xff1a; (4)实验步骤&#xff1a; 1.先下载vmware workstation pro软件&#xff0c;下载地址:https://www.vmware.com/products/workstation-pr o/workstation-pro-evaluation.html 2.下载完成后&…

vue+element 树形结构 改成懒加载模式(原理element有),这里只做个人理解笔记

1 找到属性标签添加 lazy 和 :load"loadNode" 这两个属性 2 引入树形接口,并和后端约定好传值,(拿我的举例 第一次获取全部父级默认第一次传参数:{ parentId : 0},可获取全部父级 第二次通过点击的子级把子级id传进去,这一步就用到了:load"loadNode&quo…

路由器使用docker安装mysql和redis服务

路由器使用docker安装mysql和redis服务 1.先在路由器中开启docker功能 &#xff08;需要u盘 或者 移动硬盘&#xff09; 2. docker 管理地址 :http://192.168.0.1:11180/#/ 3. 拉取镜像 4. mysql容器参数设置 MYSQL_ROOT_PASSWORD 5. redis 容器设置 开发经常需要用到 &…

Synchronized关键字的深入分析

一、引言 在多线程编程中&#xff0c;正确地管理并发是确保程序正确运行的关键。Java提供了多种同步工具&#xff0c;其中synchronized关键字是最基本且最常用的同步机制之一。本文旨在深入解析synchronized的实现原理&#xff0c;探讨其在不同应用场景中的使用&#xff0c;并…

​解析什么是物联网接入网关?-天拓四方

随着物联网技术的飞速发展&#xff0c;越来越多的设备、传感器和系统被连接到互联网&#xff0c;形成了一个庞大的、相互连接的智能网络。在这个网络中&#xff0c;物联网接入网关扮演着至关重要的角色&#xff0c;它不仅是连接物联网设备和云平台的桥梁&#xff0c;还是实现设…

数据结构-二叉树-堆(二)

一、建堆的时间复杂度问题 1、除了向上调整建堆&#xff0c;我们还可以向下调整建堆。不能在根上直接开始向下调整。这里的条件就是左右子树必须都是大堆或者小堆。我们可以倒着往前走&#xff0c;可以从最后一个叶子开始调整。但是从叶子开始调整没有意义。所以我们可以从倒数…

mysql的多表查询和子查询

多表查询&#xff1a;查询数据时&#xff0c;需要使用多张表来查询 多表查询分类&#xff1a; 1.内连接查询 2.外连接查询 3.子查询 笛卡尔积&#xff1a; create table class (id int primary key auto_increment,name varchar(10) ); create table student (id int primar…

serdes 同轴电缆和双绞线接法

1、同轴电缆 Coaxial Cable 2、双绞线STP&#xff08;Shielded Twisted Pair&#xff09; 比如我们用的车载camera一般就只需要接一路即可&#xff0c;RIN接camera&#xff0c; RIN-通过电容接地。

python基础——正则表达式

&#x1f4dd;前言&#xff1a; 这篇文章主要想讲解一下python中的正则表达式&#xff1a; 1&#xff0c;什么是正则表达式 2&#xff0c;re模块三匹配 3&#xff0c;元字符匹配 4&#xff0c;具体示例 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&am…

认识HTTP

HTTP缺点 通信使用明文&#xff08;不加密&#xff09;&#xff0c;内容可能会被窃听 不验证通信方的身份&#xff0c;可能遭遇伪装 无法证明报文的完整性&#xff0c;所以有可能遭篡改 一、通信使用明文&#xff08;不加密&#xff09;&#xff0c;内容可能会被窃听 TCP/…

Git--基础学习--面向企业--持续更新

一、基础学习 1.1基本命令 //查询基础信息 git config --global --list //选取合适位置创建 mkdir 文件名 //创建文件夹 //全局配置 git config --global user.email "****e***i" git config --global user.name "*** K****"//--------------------进入…

西瓜书学习——线性判别分析

文章目录 定义LDA的具体步骤1. 计算类内散布矩阵&#xff08;Within-Class Scatter Matrix&#xff09;2. 计算类间散布矩阵&#xff08;Between-Class Scatter Matrix&#xff09;3. 求解最佳投影向量4. 数据投影5. 分类 定义 线性判别分析&#xff08;Linear Discriminant A…

php动态高亮web源代码

php动态高亮web源代码 注&#xff1a;配置好不允许高亮的文件名&#xff0c;安全第一 #php实现动态展示目录树结构源代码 适用于开放源代码&#xff0c;结合html缓存使用效果更佳&#xff0c;因循环较多不适合放首页 能力有限没实现行号 演示&#xff1a;show source|开放…

多家企业机密数据遭Lockbit3.0窃取,亚信安全发布《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件87起&#xff0c;与上周相比勒索事件大幅下降。美国依旧为受勒索攻击最严重的国家&#xff0c;占比45%。 本周Cactus是影响最严重的勒索家族&#xff0c;Lockbit3.0和Bianlian恶意家族紧随其后&#xff0c;从整体上看Lockbit3.0依旧…

git 命令怎么回退到指定的某个提交 commit hash 并推送远程分支?

问题 如下图&#xff0c;我要回退到 【002】Babel 的编译流程 这一次提交 解决 1、先执行下面命令&#xff0c;输出日志&#xff0c;主要就是拿到提交 commit 的 hash&#xff0c;上图红框即可 git log或者 vscode 里面直接右击&#xff0c;copy sha 2、执行下面命令回退 g…

05_Scala运算符

文章目录 **1.Scala运算符****2.scala中没有 --等语法****3.逻辑运算符和Java完全相同****4.scala认为万物皆对象** 1.Scala运算符 Scala底层 使用的是equals() 程序员比较两个量的时候&#xff0c;谁来没事比较内存地址&#xff1f; Java中引用数据类型比较地址&#xff0…