Flutter网络请求框架Dio源码分析以及封装--Cookie管理分析
前言
上一篇文章我们简单分析了一下Dio发出请求时的大致工作流程,这个只是Dio最基本的功能,而且我们还没有分析走到httpClientAdapter之后的内容。不过不用着急,这次我们先接着上一次的内容,看一下Dio当中Cookie管理的问题,因为之前在项目中碰到了这个问题,回过头来再从源码的角度去分析一下,算是复盘。
问题
之前碰到的问题是这样的:登录接口在登陆成功后会返回一个Cookie给客户端,包含在Response的
“set-cookie”Headers属性里。之后在客户端这边调用某些接口时后台需要对Cookie进行验证,所以需要把Cookie存到内存甚至硬盘里,在请求头里面带上传给后台,否则会后台会报请求失败。
由于以前的项目基本上是采取token的方式去做接口鉴权,所以这种cookie持久化的方法对我来说有点陌生,不过最后还是能想到利用拦截器去做这个事情。Dio允许我们自定义拦截器,对请求与返回的参数进行调整,我们在onResponse回调方法里,从Response里面的headers拿到Cookie,再在onRequest里面加到RequestOptions里。原理很简单,但是之前自己实现的时候很多细节没有处理好,造成了代码的冗余以及不够健壮。
实际上,Dio提供了配套的Plugin:dio_cookie_manager 来帮助我们进行Cookie的管理,使用起来也非常的方便。那么这次我们就一起来看一下它是怎么处理这些问题的。
如何使用
首先我们需要导入cookie_manager的库,基于项目中用到的2.0.0版本
它又间接依赖cookie_jar3.0.0这个版本
dependencies:
dio_cookie_manager: ^2.0.0
cookie_jar: ^3.0.0
final dio = Dio();
final cookieJar = CookieJar();
dio.interceptors.add(CookieManager(cookieJar));
如示例中所示,我们需要构造一个CookieJar的实例,然后将它传入CookieManager的构造方法中,最后添加到Dio的拦截器列表中。
CookieJar
我们先来看看CookieJar这个类:
/// CookieJar is a cookie manager for http requests。
abstract class CookieJar {
factory CookieJar({
bool ignoreExpires = false}) {
return DefaultCookieJar(ignoreExpires: ignoreExpires);
}
/// Save the cookies for specified uri.
Future<void> saveFromResponse(Uri uri, List<Cookie> cookies);
/// Load the cookies for specified uri.
Future<List<Cookie>> loadForRequest(Uri uri);
Future<void> deleteAll();
Future<void> delete(Uri uri, [bool withDomainSharedCookie = false]);
final bool ignoreExpires = false;
}
CookieJar是抽象类,最终还是调用了DefaultCookieJar这个类的构造方法
/// [DefaultCookieJar] is a default cookie manager which implements the standard
/// cookie policy declared in RFC. [DefaultCookieJar] saves the cookies in RAM, so if the application
/// exit, all cookies will be cleared.
class DefaultCookieJar implements CookieJar {
/// [ignoreExpires]: save/load even cookies that have expired.
DefaultCookieJar({
this.ignoreExpires = false});
...
}
DefaultCookieJar是CookieJar的一种默认实现,按照http的格式将cookie从Request与Response中解析出来,并保存在Ram中。
CookieManager
接着来看看CookieManager这个类:
/// Don't use this class in Browser environment
class CookieManager extends Interceptor {
final CookieJar cookieJar;
CookieManager(this.cookieJar);
```、
```dart

文章详细分析了FlutterDio库中Cookie的管理,包括如何使用CookieJar、CookieManager和PersistCookieJar进行Cookie的保存与加载。在Dio的拦截器中,CookieManager负责在请求和响应中处理Cookie,而PersistCookieJar实现了Cookie的持久化存储,确保应用退出后仍能保留Cookie。通过这些工具,开发者可以更方便地处理登录状态和接口鉴权问题。
最低0.47元/天 解锁文章
1768

被折叠的 条评论
为什么被折叠?



