Flutter——Dio网络库的使用与封装
Dio网络库的使用与封装
- 导入依赖
- 定义变量
- 创建Dio对象
- 封装Get和Post请求
- 网络请求
- 释放dio对象
- 封装类
- 解析
- 使用
导入依赖
#网络库dio: ^4.0.0
定义变量
// default optionsstatic const int _connectTimeout = 15000; //15sstatic const int _receiveTimeout = 15000;static const int _sendTimeout = 10000;static const String GET = 'get';static const String POST = 'post';static const String PUT = 'put';static const String PATCH = 'patch';static const String DELETE = 'delete';static var _dio;static HttpUtil? _httpUtil;static HttpUtil getInstance() => _httpUtil ??= HttpUtil();
创建Dio对象
// 创建 dio 实例对象Dio _createInstance() {if (_dio == null) {/// 全局属性:请求前缀、连接超时时间、响应超时时间var options = BaseOptions(// responseType: ResponseType.json,baseUrl: HttpPath.BaseUrl,connectTimeout: _connectTimeout,receiveTimeout: _receiveTimeout,sendTimeout: _sendTimeout,);//拦截器var interceptor = InterceptorsWrapper(onRequest: (options,handler){print("\n================================= 请求数据 =================================");print("method = ${options.method.toString()}");print("url = ${options.uri.toString()}");print("headers = ${options.headers}");print("params = ${options.queryParameters}");return handler.next(options);},onResponse: (response,handler,){print("\n================================= 响应数据开始 =================================");print("code = ${response.statusCode}");print("data = ${response.data}");print("================================= 响应数据结束 =================================\n");return handler.next(response);},onError: (e,handler){print("\n=================================错误响应数据 =================================");print("type = ${e.type}");print("message = ${e.message}");print("stackTrace = ${e.stackTrace}");print("\n");return handler.next(e);});_dio = Dio(options);_dio.interceptors.add(interceptor);}return _dio;}
封装Get和Post请求
Future<T> get<T>(String url, FormData? param) async {return _requestHttp<T>(url,param: param,method: GET,);}Future<T> post<T>(String url, FormData param) async {return _requestHttp<T>(url,param: param,method: POST,);}
网络请求
_requestHttp<T>(String url, {param, method}) async {_dio = _createInstance();try {Response response = await _dio.request(url,data: param,options: Options(method: method));if (response.statusCode == 200) return response.data;} on DioError catch (e) {/// 打印请求失败相关信息print("【请求出错】${e.toString()}");rethrow;}}
释放dio对象
clear() {_dio = null;}
封装类
class HttpUtil {// default optionsstatic const int _connectTimeout = 15000; //15sstatic const int _receiveTimeout = 15000;static const int _sendTimeout = 10000;static const String GET = 'get';static const String POST = 'post';static const String PUT = 'put';static const String PATCH = 'patch';static const String DELETE = 'delete';static var _dio;static HttpUtil? _httpUtil;static HttpUtil getInstance() => _httpUtil ??= HttpUtil();// 创建 dio 实例对象Dio _createInstance() {if (_dio == null) {/// 全局属性:请求前缀、连接超时时间、响应超时时间var options = BaseOptions(// responseType: ResponseType.json,baseUrl: HttpPath.BaseUrl,connectTimeout: _connectTimeout,receiveTimeout: _receiveTimeout,sendTimeout: _sendTimeout,);//拦截器var interceptor = InterceptorsWrapper(onRequest: (options,handler){print("\n================================= 请求数据 =================================");print("method = ${options.method.toString()}");print("url = ${options.uri.toString()}");print("headers = ${options.headers}");print("params = ${options.queryParameters}");return handler.next(options);},onResponse: (response,handler,){print("\n================================= 响应数据开始 =================================");print("code = ${response.statusCode}");print("data = ${response.data}");print("================================= 响应数据结束 =================================\n");return handler.next(response);},onError: (e,handler){print("\n=================================错误响应数据 =================================");print("type = ${e.type}");print("message = ${e.message}");print("stackTrace = ${e.stackTrace}");print("\n");return handler.next(e);});_dio = Dio(options);_dio.interceptors.add(interceptor);}return _dio;}Future<T> get<T>(String url, FormData? param) async {return _requestHttp<T>(url,param: param,method: GET,);}Future<T> post<T>(String url, FormData param) async {return _requestHttp<T>(url,param: param,method: POST,);}/// T is Map<String,dynamic> or List<dynamic>_requestHttp<T>(String url, {param, method}) async {_dio = _createInstance();try {Response response = await _dio.request(url,data: param,options: Options(method: method));if (response.statusCode == 200) return response.data;} on DioError catch (e) {/// 打印请求失败相关信息print("【请求出错】${e.toString()}");rethrow;}}// 清空 dio 对象clear() {_dio = null;}}
解析
使用一个插件JsonToDartBeanAction
,建造一个新的实体类,只需将对应的Json
字符串复制进去,然后它就会自动生成实体类和对应的解析类
使用
Future<List<ITopEntity>?> getTopList(int skip,int limit) async {var url = HttpPath.getTop250(skip, limit);final result = await HttpUtil.getInstance().get(url, null);return jsonConvert.convertListNotNull<ITopEntity>(result);
}
Flutter——Dio网络库的使用与封装相关推荐
- flutter dio网络请求 get post 图片上传
Dio下载地址github:dio 初始化网络请求 BaseOptions option = BaseOptions(); //初始化cotentType option.contentType = C ...
- Flutter Dio网络请求:DioError [DioErrorType.RESPONSE]: Http status error [400]或者[500]
DioError [DioErrorType.RESPONSE]: Http status error [400] 1)检查请求参数是否正确 : 比如,如果参数map中value是一个数组,如下代码中 ...
- 发布一个基于 Reactor 模式的 C++ 网络库
发布一个基于 Reactor 模式的 C++ 网络库 陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice 2010 Aug 30 本文主要介绍 muduo 网 ...
- 《Linux多线程服务端编程:使用muduoC++网络库》学习笔记
文章目录 第1章 线程安全的对象生命期管理 1.1 当析构函数遇到多线程 1.1.1 线程安全的定义 1.1.3 线程安全实例 1.2 对象的创建很简单 1.3 销毁很难 1.4 线程安全的Obser ...
- muduo网络库设计与实现(二)
muduo网络库设计与实现(一) 文章目录 muduo网络库设计与实现(一) base InetAddress Socket 单线程网络库 Acceptor TcpServer TcpConnecti ...
- muduo网络库:18---muduo简介之(muduo库的由来、编译安装、目录结构、代码结构、线程模型)
一.由来 2010年3月陈硕先生写了一篇<学之者生,用之者死--ACE历史与简评>(文章参阅:https://blog.csdn.net/Solstice/article/details/ ...
- dio网络框架封装_Flutter 使用dio来发起网络请求以及Cookie管理
前言 Flutter官方建议您使用 dio 来发起网络请求,在学习过程中,也尝试过用dart io中的HttpClient发起的请求,这里主要讲一下dio的使用以及CookieJar.CookieMa ...
- Flutter Dio包网络请求抓包解决方案
在Flutter中进行网络请求时,我们可以使用的库有3个,即Http请求库.HttpClient请求库和Dio请求库(详细介绍请参考:Flutter开发之Http网络请求),使用得最多的就是Dio请求 ...
- Flutter Dio的简易封装和demo
flutter_net_demo 一个简单的flutter dio的封装, 包括: 日志打印, 网络进度, 返回json转bean, get post upload方法的封装, 简易可直接运行的dem ...
最新文章
- Swagger+AutoRest 生成web api客户端(.Net)
- 五十四、快速上手uniapp
- vue中mixin 感觉很牛逼(父子组件融合成一个新组件)
- php把这两个二维数组合并,两个二维数组的合并
- Lucas+阶乘打表+费马小定理模板2.0
- php laravel 理解,程序员-说一下PHP框架Laravel,如何理解她的思想
- 软件项目投标流程及注意事项
- java语言的基本介绍及相关特性
- 摄像头视频直播方案比较之方案二:乐橙云
- js实现电子签名功能
- 爬虫-东北林业大学校内-中国[哈尔滨]森林博物馆-爬取所有馆藏蝴蝶图片
- php的样式怎么设置字体大小,css中如何改变字体大小
- 计算机正确的录入指法教案,《文字录入教案》word版.doc
- 英语--罗塞塔学习总结
- pythonfunc函数的功能,python函数中def func(*args)这里*的作用是什么?
- TM1638驱动数码管的一点建议,附程序
- Tableau 2022.3的Table Extension到底怎么用?
- 同事逆袭面进阿里P7 年薪60W+,临别留下一张Android开发重点技术路线图
- JDK1.7绿色解压版64位
- Python实现微信自动化发送信息