前言

Flutter官方建议您使用 dio 来发起网络请求,在学习过程中,也尝试过用dart io中的HttpClient发起的请求,这里主要讲一下dio的使用以及CookieJarCookieManager管理cookie

dio

dio是一个强大易用的dart http请求库,支持Restful APIFormData、拦截器、请求取消、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了,这才注意到:

CookieJarcookie保存在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管理相关推荐

  1. 【OkHttp】OkHttp 源码分析 ( 网络框架封装 | OkHttp 4 迁移 | OkHttp 建造者模式 )

    OkHttp 系列文章目录 [OkHttp]OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) [OkHttp]Android 项目导入 OkHttp ( 配置依赖 | 配置 ...

  2. MVVM+Retrofit+Kotlin网络框架封装

    上篇文章讲了MVVM入门,网络请求部分非常简单和原始,本篇则是上一篇的进阶,主要讲解如何在vm中使用协程结合Retrofit进行网络框架的封装. GitHub完整版:https://github.co ...

  3. 上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一)

    上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一) 上篇文章中给大家简单介绍了一些业务,上门洗车APP --- Android客户端开发 前言及业务简介,本篇文章给大家介绍下 ...

  4. iOS swift Alamofire+HandyJSON网络框架封装

    iOS swift Alamofire+HandyJSON网络框架封装 我们在学习Objective_C时使用的网络框架是AFNetworking+MJExtension,而在swift中Alamof ...

  5. dio设置自定义post请求_Flutter 使用dio来发起网络请求以及Cookie管理

    说点儿闲话 Flutter官方建议您使用 dio 来发起网络请求,在学习过程中,也尝试过用dart io中的HttpClient发起的请求,这里主要讲一下dio的使用以及CookieJar.Cooki ...

  6. Android之全面解析Retrofit网络框架封装库

    转载请标明出处:[顾林海的博客] 前言 Retrofit是Square公司推出的一个HTTP的框架,主要用于Android和Java,Retrofit会将每一个HTTP的API请求变成一个Java的接 ...

  7. java retrofit_Android开发Retrofit2+Rxjava2+okHttp 网络框架封装

    释放双眼,带上耳机,听听看~! 说明 RxJava的概念其实很模糊,我对它的理解就是一个给你方便处理异步问题的框架,到底有多方便,体会过才知道... Retrofit就是对okhttp做了一层封装.把 ...

  8. Retrofit2+Rxjava2+okHttp 网络框架封装

    说明 RxJava的概念其实很模糊,我对它的理解就是一个给你方便处理异步问题的框架,到底有多方便,体会过才知道... Retrofit就是对okhttp做了一层封装.把网络请求都交给给了Okhttp, ...

  9. 最简易的网络框架封装(新手可看)

    网络通信在Android上的重要性就不多说了. demo就是获取到"https://www.baidu.com/"的HTML代码后显示在textview中,如下图:(源码在文章结尾 ...

最新文章

  1. AOSuite V2.7 发布,JavaEE快速开发平台
  2. Web.config配置访问权限
  3. python input函数赋值法_大佬们 我是刚开始学python的小白 遇到这种赋值方式 实在不懂这个a+b是赋值给谁的 求解...
  4. 马斯克表示担心人工智能可能会在5年内超越人类
  5. Python匿名函数---排序
  6. cacti安装配置详解_MySQL实战001:8.0免安装版服务配置详解
  7. Tail Recursion尾递归
  8. linux命令中的cp,Linux高级技术:关于cp命令中拷贝所有的写法
  9. diy 多路监控_如何通过此DIY设置监控空气质量
  10. 在html页面中加入矢量图,在html中引用矢量图
  11. Unity资源管理(一)
  12. Python pickle 反序列化详解
  13. Bootstrap的js插件之側边栏停靠(affix)
  14. 5G时代将给智能营销笔记本带来什么样的改变
  15. 【导弹四种坐标系及坐标系之间的变换】
  16. 【可见光室内定位】(三)基于图像传感器CMOS的可见光室内定位技术
  17. 如何加入到 wuhan2020 开源项目,打赢这场没有硝烟的战争?
  18. 硬盘数据恢复的原理是什么?清空、格式化数据真的就没有了吗?
  19. SQL本地数据库连接服务器
  20. 计算机知识在物理学中的应用,浅谈物理学在多种领域中的应用

热门文章

  1. 高考大数据:哪个省才是高考地狱模式?结论和想象不太一样
  2. 五分钟读懂TCP 协议
  3. 正则表达式匹配分组(|、(ab)、\num、(?P<name>)(?P=name))
  4. ACMNO.49:一元三次方程求解(主要就是精度问题)
  5. 技术18期:数据安全之加密与实现
  6. 图像分类和目标检测技术有什么区别?
  7. 第二十篇:Summarisation摘要
  8. 学习作用域中的“名词”
  9. Spring系列之Spring常用注解总结
  10. 关于软件开发你真正需要知道的几个事情