请求header_Flutter 基于网络请求框架Dio的二次封装
前言
dio是Flutter中文网开源的一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时等...
使用
- 使用dio get请求一条json数据
getRequest() async { Response response = await Dio() .get('https://...'); this.setState(() { result= response.toString(); }); }
- 利用dio post请求注册一个新用户
postRequest() async { var path = "https://.../user/register"; var params = { "username": "yth", "password": "123456", "repassword": "123456" }; Response response = await Dio().post(path, queryParameters: params); this.setState(() { result= response.toString(); }); }
二次封装
在项目开发过程中随着项目越写越大,代码量也会成倍的增加,隔离业务抽取共性代码的思想自然而然的出现在一个严于律己的开发者脑子里,特别是像网络请求这种操作,好的封装不仅会减少冗余代码更能让代码层级变得清晰可读,下面笔者就带着自己的理解对Dio做一个简单封装,笔者自认为才疏学浅,代码中如有写的不好的地方还请各位不吝赐教。
一般我们在处理工具类时都会用到单例的思想,做为一个项目全局的网络请求工具类,我们同样也把DioUtils封装成单例模式
static DioUtils getInstance() { if (_instance == null) { _instance = new DioUtils(); } return _instance; }
对于请求参数的初始化跟一些网络配置,Dio为开发者提供了BaseOptions、Options、RequestOptions可选Options配置,三者的优先级关系依次递增
先来看下BaseOptions给我们提供的可供配置的参数:
BaseOptions({ String method, int connectTimeout, int receiveTimeout, Iterable cookies, this.baseUrl, this.queryParameters, Map extra, Map headers, ResponseType responseType = ResponseType.json, ContentType contentType, ValidateStatus validateStatus, bool receiveDataWhenStatusError = true, bool followRedirects = true, int maxRedirects = 5, RequestEncoder requestEncoder, ResponseDecoder responseDecoder,})
上面构造方法中的属性读者基本都能见名知意做到自解释,我就不单独解释了,贴上一段我在代码里的配置:
//请求参数配置 _baseOptions = new BaseOptions( baseUrl: BASE_URL, //请求服务地址 connectTimeout: 5000, //响应时间 receiveTimeout: 5000, headers: { //需要配置请求的header可在此处配置 }, //请求的Content-Type,默认值是[ContentType.json]. 也可以用ContentType.parse("application/x-www-form-urlencoded") contentType: ContentType.json, //表示期望以那种格式(方式)接受响应数据。接受三种类型 `json`, `stream`, `plain`, `bytes`. 默认值是 `json`, responseType: ResponseType.json, );然后把_baseOptions通过参数的形式传入Dio实例中完成配置的初始化
然后把_baseOptions通过参数的形式传入Dio实例中完成配置的初始化
//创建dio实例 _dio = new Dio(_baseOptions);
接下来我把我们开篇用DIO做的简单GET、POST方法用我们新写的工具类封装完成后重新做请求,让我们来一起感受下封装带来的便利。
- 封装GET请求
/** * get请求 */ get(url, {data, options, cancleToken}) async { print('get request path ------${url}-------请求参数${data}'); Response response; try { response = await _dio.get(url, queryParameters: data, options: options, cancelToken: cancleToken); print('get success ---${response.data}'); } on DioError catch (e) { print('请求失败---错误类型${e.type}'); } return response.data; }
利用我们封装好的get请求方法,开篇的get请求只需改为:
getRequest() async { String result= await DioUtils().get('/banner/json'); this.setState(() { resultJson = result; }); }
在刚刚讲BaseOptions时,我们提到还有Options、RequestOptions可供配置,我们提到可以利用Options的优先级重新覆盖掉原先在工具类里设置好的网络配置,比如修改提前在header中设置好的请求内容。 还是上述代码,我先修改_baseOptions中的header的配置如下:
我们利用Options修改BaseUrl后的请求url
_baseOptions = new BaseOptions( baseUrl: BASE_URL, connectTimeout: 5000, receiveTimeout: 5000, headers: { //预设好的header信息 "testHeader":"bb" }, contentType: ContentType.json, responseType: ResponseType.json, );
还是上述请求,现在我们重新走一遍上述的get请求,看下log控制台打印的header信息
然后我修改原先的get请求,给options添加RequestOptions,修改里面的header值如代码所示:
getRequest() async { var data = {"cid": 60}; RequestOptions requestOptions = new RequestOptions(headers: {"testHeader":"aaaa"}); String result = await DioUtils() .get('/article/list/0/json', data: data,options: requestOptions); this.setState(() { resultJson = result; }); }
运行代码,再次执行get请求,控制台的header信息已经被我们修改过了:
通过RequestOptions不仅仅是可以修改headerl,基本你能在工具类设置的东西都能做修改,感兴趣的读者可以自行阅读源码测试,限于篇幅问题我这里就不展开讲解了。
POST请求封装 POST请求封装跟GET类似,这里我就不过多分析了
利用拦截器给网络请求添加统一参数
在DIo中我们可以通过Interceptors为我们的网络请求添加拦截器
_dio.interceptors.add()
我们通过_dio.interceptors.add()方法可以根据不同业务为我们的工具类添加不同的拦截器,比如在网络请求开始之前,我们给每个请求都添加统一的token,或者userId,或者我们可以对请求返回的数据做统一json格式化处理,对错误响应统一处理,这些业务场景都可以通过interceptors来完成,比如下面我的配置:
//可根据项目需要选择性的添加请求拦截器 _dio.interceptors.add( InterceptorsWrapper(onRequest: (RequestOptions requestions) async { //此处可网络请求之前做相关配置,比如会所有请求添加token,或者userId requestions.queryParameters["token"] = "testtoken123443423"; requestions.queryParameters["userId"] = "123456"; return requestions; }, onResponse: (Response response) { //此处拦截工作在数据返回之后,可在此对dio请求的数据做二次封装或者转实体类等相关操作 return response; }, onError: (DioError error) { //处理错误请求 return error; }), ); }
现在我们通过工具类进行的所有的网络请求的url后面都会被加入token=“testtoken123443423”&userId=123456这样两个参数,还是上面的GET请求,下面我们通过代码跟控制台的输出内容看下通过拦截器添加完通用参数的请求,log控制台打印的请求参数信息
getRequest() async { var data = {"cid": 60}; String result = await DioUtils() .get('/article/list/0/json', data: data); this.setState(() { resultJson = result; }); }
上面的GET请求,我们在参数里只添加了cid = 60的参数,但是通过控制台我们已经清楚的看到token跟userId已经通过拦截器的被我们添加到queryParameters里面了。
Dio二次封装代码
请求header_Flutter 基于网络请求框架Dio的二次封装相关推荐
- Flutter - dio 简单二次封装
demo 地址: https://github.com/iotjin/jh_flutter_demo Flutter Dio简单二次封装和自定义Header Flutter Dio二次封装 Flutt ...
- react多个网络请求_react中网络请求的优化!
react中网络请求的优化! 在页面跳转的时候 我会去检查一下 redux中是否存在我需要的值 如果没有 我再去调用接口 如果有的话 那我就不去发网络请求: 如果上个接口挂掉了, 那么我下个接口就不发 ...
- 微信小程序request请求实例,网络请求。
最近微信小程序开始开放测试了,小程序提供了很多api,极大的方便了开发者,其中网络请求api是wx.request(object),这是小程序与开发者的服务器实现数据交互的一个很重要的api. 官方参 ...
- android xutils json请求,Android Xutils3网络请求的封装详解及实例代码
Xutils3网络请求的封装详解 封装了一个Xutil3的网络请求工具类,分享给大家,本人水平有限,不足之处欢迎指出. 使用前先配置xutils3: 1.gradle中添加 compile 'org. ...
- python 大量网络请求失败_网络请求异常拦截优化
public class ExceptionUtils { /* * 在使用Retrofit+RxJava时,我们访问接口,获取数据的流程一般是这样的:订阅->访问接口->解析数据-> ...
- android 全局网络请求,Android项目get/post请求,对网络请求在全局设置请求体的获取和加密。...
第一次对请求体进行加密操作,记录一下大坑.废话不多说看代码 我用的novate网络框架 转载地址---https://blog.csdn.net/u013651026/article/details/ ...
- dio设置自定义post请求_Flutter Dio简单二次封装和自定义Header
话不多说自己看代码封装的比较简单,比较适合入门学习Dio. import 'package:dio/dio.dart'; import 'Api.dart'; /* * 封装 restful 请求 * ...
- 一款基于RxJava2+Retrofit2实现简单易用的网络请求框架
本库是一款基于RxJava2+Retrofit2实现简单易用的网络请求框架,结合android平台特性的网络封装库,采用api链式调用一点到底,集成cookie管理,多种缓存模式,极简https配置, ...
- 基于RxJava2+Retrofit2简单易用的网络请求实现
代码地址如下: http://www.demodashi.com/demo/13473.html 简介 基于RxJava2+Retrofit2实现简单易用的网络请求,结合android平台特性的网络封 ...
- Flutter 项目实战 Dio网络请求 四
/ HTTP | HTTPS / HTTP是一个客户端(用户)和 服务端(网站)之间请求和应答的标准,通常使用TCP协议.客户端发起一个HTTP请求到服务器上指定端口(默认端口为80).客户 ...
最新文章
- rmi 反序列化漏洞_提醒:Apache Dubbo存在反序列化漏洞
- 使用事务操作SQLite数据批量插入,提高数据批量写入速度,源码讲解
- Centos 7 配置 NFS
- oracle00011,oracle11g 导出表报EXP-00011:table不存在。
- 雷军的手机屏保亮了,网友哭笑不得:我还以为是董明珠呢!
- 2.2 清除标注错误的数据
- 十分钟搞定CSS选择器
- MySQL: 查看一次SQL的执行时间都花在哪些环节上
- [转]常见的软件版本编号及命名
- NSIS:在线下载并安装程序
- 如何看待IT培训这件事情?IT培训出来的人都一无是处吗?
- html5 励志名言,励志名言五十条
- 主引导记录(MBR)
- Android图片的裁剪
- 小数化分数的口诀表_循环小数化分数口诀
- 什么是代码签名?代码签名的好处
- 求素数的python程序,Python-求素数程序
- C# Process.HasExited准确性
- PHP 将大量数据导出到 Excel 的方法
- CSP认证:行车路线