dio网络框架封装_Flutter 使用dio来发起网络请求以及Cookie管理
前言
Flutter官方建议您使用 dio
来发起网络请求,在学习过程中,也尝试过用dart io
中的HttpClient
发起的请求,这里主要讲一下dio
的使用以及CookieJar
、CookieManager
管理cookie
。
dio
dio
是一个强大易用的dart http
请求库,支持Restful API
、FormData
、拦截器、请求取消、Cookie
管理、文件上传/下载……详情请查看 github dio
最新版本请查看:pub.dev dio
在pubspec.yaml文件里添加:
dio: ^3.x.x // 请使用pub上3.0.0分支的最新版本
创建一个Dio实例,并配置它
建议在项目中使用Dio单例,这样便可对同一个dio实例发起的所有请求进行一些统一的配置,比如设置公共header、请求基地址、超时时间等;
在这里,baseUrl
需要单独创建一个共用的BaseUrl.url
:
class BaseUrl {// 配置默认请求地址static String url = 'http://xxxxx/'; // 测试环境
}
BaseUrl.url
也方便后面Cookie
管理用到。
使用默认配置:
Dio dio = Dio(); // 使用默认配置// 配置dio实例
dio.options.baseUrl = BaseUrl.url;
dio.options.connectTimeout = 5000; //5s
dio.options.receiveTimeout = 3000;
或者
// 通过传递一个 `options`来创建dio实例
Options options = BaseOptions(baseUrl: BaseUrl.url,connectTimeout: 5000,receiveTimeout: 3000,
);
Dio dio = Dio(options);
发起请求及响应数据
发起一个GET
请求 :
Response response;
Dio dio = Dio();
response = await dio.get("/test?id=12&name=wendu")
print(response.data.toString());
// 请求参数也可以通过对象传递,上面的代码等同于:
response = await dio.get("/test", queryParameters: {"id": 12, "name": "wendu"});
print(response.data.toString());
发起一个POST
请求:
response = await dio.post("/test", data: {"id": 12, "name": "wendu"});
try {Response response = await dio.get("https://www.google.com");print(response.data);print(response.headers);print(response.request);print(response.statusCode);} on DioError catch (e) {//catch 提示print('catch 提示: ' + e.toString());} finally {}
CookieJar 和 CookieManager
github CookieJar
pub.dev cookie_jar
github dio_cookie_manager
pub.dev dio_cookie_manager
在pubspec.yaml文件里添加:
cookie_jar: ^1.0.x #latest version
dio_cookie_manager: ^1.0.x #latest version
import 'package:flutter/material.dart';
import 'package:cookie_jar/cookie_jar.dart';class Api { static final CookieJar cookieJar = new CookieJar();}
在项目中其他所有的dart文件中使用:
List<Cookie> cookies = [new Cookie("xxx", xxx),// ....
];
//Save cookies
Api.cookieJar.saveFromResponse(Uri.parse(BaseUrl.url), cookies);//获取cookies
List<Cookie> cookies = Api.cookieJar.loadForRequest(Uri.parse(BaseUrl.url));// print(cookies);
需要注意的是,一般我们的项目中登录接口调用成功后,后端会在cookie
中写入token
,所以登录请求前先建立CookieManager
来自动管理cookie:
import 'package:dio_cookie_manager/dio_cookie_manager.dart';dio.interceptors.add(CookieManager(await Api.cookieJar));
一开始,我在app中使用的上述方法存cookie,开发过程中都是flutter run
运行的,后来打包测试,发现后台杀掉app时,获取不到cookie了,这才注意到:
CookieJar
将cookie
保存在RAM
中,因此,如果应用程序退出,则将清除所有cookie
。
于是,改为使用下面的PersistCookieJar
。
PersistCookieJar
PersistCookieJar
将cookie保存在文件
中,因此,如果应用程序退出,则cookie始终存在,除非显式调用delete
。
将上述Api中的CookieJar()
改为PersistCookieJar
:
注意:在flutter中,传递给PersistCookieJar的路径必须有效(存在于电话中并具有写访问权限)。您可以使用path_provider来获取正确的路径。
在pubspec.yaml文件里添加:
path_provider: ^1.0.x #latest version
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:cookie_jar/cookie_jar.dart';
import 'package:path_provider/path_provider.dart';class Api { //改为使用 PersistCookieJar,在文档中有介绍,PersistCookieJar将cookie保留在文件中,因此,如果应用程序退出,则cookie始终存在,除非显式调用deletestatic PersistCookieJar _cookieJar;static Future<PersistCookieJar> get cookieJar async {// print(_cookieJar);if (_cookieJar == null) {Directory appDocDir = await getApplicationDocumentsDirectory();String appDocPath = appDocDir.path;print('获取的文件系统目录 appDocPath: ' + appDocPath);_cookieJar = new PersistCookieJar(dir: appDocPath);}return _cookieJar;}
}
在项目中其他所有的dart文件中使用改为:
List<Cookie> cookies = [new Cookie("xxx", xxx),// ....
];
//Save cookies
(await Api.cookieJar).saveFromResponse(Uri.parse(BaseUrl.url), cookies);//获取cookies
List<Cookie> cookies = (await Api.cookieJar).loadForRequest(Uri.parse(BaseUrl.url));// print(cookies);
建立CookieManager
来自动管理cookie
的代码不改变。
参考资料
dio
Http请求-Dio http库
github CookieJar
pub.dev cookie_jar
github dio_cookie_manager
pub.dev dio_cookie_manager
path_provider
Flutter用dio封装http网络请求,设置统一的请求地址、headers及处理返回内容
原文作者:北堂棣
原文链接:人类身份验证 - SegmentFault
来源:思否
dio网络框架封装_Flutter 使用dio来发起网络请求以及Cookie管理相关推荐
- 【OkHttp】OkHttp 源码分析 ( 网络框架封装 | OkHttp 4 迁移 | OkHttp 建造者模式 )
OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...
- MVVM+Retrofit+Kotlin网络框架封装
上篇文章讲了MVVM入门,网络请求部分非常简单和原始,本篇则是上一篇的进阶,主要讲解如何在vm中使用协程结合Retrofit进行网络框架的封装. GitHub完整版:https://github.co ...
- 上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一)
上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一) 上篇文章中给大家简单介绍了一些业务,上门洗车APP --- Android客户端开发 前言及业务简介,本篇文章给大家介绍下 ...
- iOS swift Alamofire+HandyJSON网络框架封装
iOS swift Alamofire+HandyJSON网络框架封装 我们在学习Objective_C时使用的网络框架是AFNetworking+MJExtension,而在swift中Alamof ...
- dio设置自定义post请求_Flutter 使用dio来发起网络请求以及Cookie管理
说点儿闲话 Flutter官方建议您使用 dio 来发起网络请求,在学习过程中,也尝试过用dart io中的HttpClient发起的请求,这里主要讲一下dio的使用以及CookieJar.Cooki ...
- Android之全面解析Retrofit网络框架封装库
转载请标明出处:[顾林海的博客] 前言 Retrofit是Square公司推出的一个HTTP的框架,主要用于Android和Java,Retrofit会将每一个HTTP的API请求变成一个Java的接 ...
- java retrofit_Android开发Retrofit2+Rxjava2+okHttp 网络框架封装
释放双眼,带上耳机,听听看~! 说明 RxJava的概念其实很模糊,我对它的理解就是一个给你方便处理异步问题的框架,到底有多方便,体会过才知道... Retrofit就是对okhttp做了一层封装.把 ...
- Retrofit2+Rxjava2+okHttp 网络框架封装
说明 RxJava的概念其实很模糊,我对它的理解就是一个给你方便处理异步问题的框架,到底有多方便,体会过才知道... Retrofit就是对okhttp做了一层封装.把网络请求都交给给了Okhttp, ...
- 最简易的网络框架封装(新手可看)
网络通信在Android上的重要性就不多说了. demo就是获取到"https://www.baidu.com/"的HTML代码后显示在textview中,如下图:(源码在文章结尾 ...
最新文章
- AOSuite V2.7 发布,JavaEE快速开发平台
- Web.config配置访问权限
- python input函数赋值法_大佬们 我是刚开始学python的小白 遇到这种赋值方式 实在不懂这个a+b是赋值给谁的 求解...
- 马斯克表示担心人工智能可能会在5年内超越人类
- Python匿名函数---排序
- cacti安装配置详解_MySQL实战001:8.0免安装版服务配置详解
- Tail Recursion尾递归
- linux命令中的cp,Linux高级技术:关于cp命令中拷贝所有的写法
- diy 多路监控_如何通过此DIY设置监控空气质量
- 在html页面中加入矢量图,在html中引用矢量图
- Unity资源管理(一)
- Python pickle 反序列化详解
- Bootstrap的js插件之側边栏停靠(affix)
- 5G时代将给智能营销笔记本带来什么样的改变
- 【导弹四种坐标系及坐标系之间的变换】
- 【可见光室内定位】(三)基于图像传感器CMOS的可见光室内定位技术
- 如何加入到 wuhan2020 开源项目,打赢这场没有硝烟的战争?
- 硬盘数据恢复的原理是什么?清空、格式化数据真的就没有了吗?
- SQL本地数据库连接服务器
- 计算机知识在物理学中的应用,浅谈物理学在多种领域中的应用
热门文章
- 高考大数据:哪个省才是高考地狱模式?结论和想象不太一样
- 五分钟读懂TCP 协议
- 正则表达式匹配分组(|、(ab)、\num、(?P<name>)(?P=name))
- ACMNO.49:一元三次方程求解(主要就是精度问题)
- 技术18期:数据安全之加密与实现
- 图像分类和目标检测技术有什么区别?
- 第二十篇:Summarisation摘要
- 学习作用域中的“名词”
- Spring系列之Spring常用注解总结
- 关于软件开发你真正需要知道的几个事情