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

2023-12-29 13:04

本文主要是介绍一文带你掌握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)方法,它提供了请求时需要填的必填参数和可选参数,当我们使用时,可以通过 类名.方法名 即可调用发起请求了。

请求返回内容

最后

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

这篇关于一文带你掌握Flutter dio网络请求库的封装的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/549522

相关文章

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

poj 3181 网络流,建图。

题意: 农夫约翰为他的牛准备了F种食物和D种饮料。 每头牛都有各自喜欢的食物和饮料,而每种食物和饮料都只能分配给一头牛。 问最多能有多少头牛可以同时得到喜欢的食物和饮料。 解析: 由于要同时得到喜欢的食物和饮料,所以网络流建图的时候要把牛拆点了。 如下建图: s -> 食物 -> 牛1 -> 牛2 -> 饮料 -> t 所以分配一下点: s  =  0, 牛1= 1~

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了

poj 2112 网络流+二分

题意: k台挤奶机,c头牛,每台挤奶机可以挤m头牛。 现在给出每只牛到挤奶机的距离矩阵,求最小化牛的最大路程。 解析: 最大值最小化,最小值最大化,用二分来做。 先求出两点之间的最短距离。 然后二分匹配牛到挤奶机的最大路程,匹配中的判断是在这个最大路程下,是否牛的数量达到c只。 如何求牛的数量呢,用网络流来做。 从源点到牛引一条容量为1的边,然后挤奶机到汇点引一条容量为m的边

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

JavaSE——封装、继承和多态

1. 封装 1.1 概念      面向对象程序三大特性:封装、继承、多态 。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节 。     比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器, USB 插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU 、显卡、内存等一些硬件元件。

配置InfiniBand (IB) 和 RDMA over Converged Ethernet (RoCE) 网络

配置InfiniBand (IB) 和 RDMA over Converged Ethernet (RoCE) 网络 服务器端配置 在服务器端,你需要确保安装了必要的驱动程序和软件包,并且正确配置了网络接口。 安装 OFED 首先,安装 Open Fabrics Enterprise Distribution (OFED),它包含了 InfiniBand 所需的驱动程序和库。 sudo

【机器学习】高斯网络的基本概念和应用领域

引言 高斯网络(Gaussian Network)通常指的是一个概率图模型,其中所有的随机变量(或节点)都遵循高斯分布 文章目录 引言一、高斯网络(Gaussian Network)1.1 高斯过程(Gaussian Process)1.2 高斯混合模型(Gaussian Mixture Model)1.3 应用1.4 总结 二、高斯网络的应用2.1 机器学习2.2 统计学2.3

网络学习-eNSP配置NAT

NAT实现内网和外网互通 #给路由器接口设置IP地址模拟实验环境<Huawei>system-viewEnter system view, return user view with Ctrl+Z.[Huawei]undo info-center enableInfo: Information center is disabled.[Huawei]interface gigabit