说点儿闲话

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

在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 cookies = [

new Cookie("xxx", xxx),

// ....

];

//Save cookies

Api.cookieJar.saveFromResponse(Uri.parse(BaseUrl.url), cookies);

//获取cookies

List 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始终存在,除非显式调用delete

static PersistCookieJar _cookieJar;

static Future 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 cookies = [

new Cookie("xxx", xxx),

// ....

];

//Save cookies

(await Api.cookieJar).saveFromResponse(Uri.parse(BaseUrl.url), cookies);

//获取cookies

List cookies = (await Api.cookieJar).loadForRequest(Uri.parse(BaseUrl.url));

// print(cookies);

建立CookieManager来自动管理cookie的代码不改变。

参考资料

dio设置自定义post请求_Flutter 使用dio来发起网络请求以及Cookie管理相关推荐

  1. uniapp网络请求获取数据_2.uni-app 发起网络请求

    ## uni.request(OBJECT) 发起网络请求. **OBJECT 参数说明** ![](https://box.kancloud.cn/a90bf284df069eddde4019c04 ...

  2. dio网络框架封装_Flutter 使用dio来发起网络请求以及Cookie管理

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

  3. python发起网络请求模块【requests、selenium、urllib、urllib3】

    python网络请求四大模块[requests.selenium.urllib.urllib3] 1.requests 该模块为python第三方库,需要使用pip安装 安装 pip install ...

  4. 鸿蒙开发-使用fetch发起网络请求

    场景 鸿蒙基于JS搭建HelloWorld并修改国际化文件: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/118274050 在 ...

  5. [Redux/Mobx] 在Redux中怎么发起网络请求?

    [Redux/Mobx] 在Redux中怎么发起网络请求? 如果单纯的使用Redux,因为redux的actionCreator返回一个plain object,所以不能在actionCreator中 ...

  6. [react] react中发起网络请求应该在哪个生命周期中进行?为什么?

    [react] react中发起网络请求应该在哪个生命周期中进行?为什么? 异步情况可以在componentDidMount()函数中进行. 同步的情况可以在componentWillMount()中 ...

  7. 微信小程序在真机上发起网络请求失败

    问题描述 在开发工具上发起网络请求没有问题,但是在真机上就收不到响应.(测试机型,荣耀9) 解决方法 代码中请求的url采用http协议即可.即使我在配置request合法域名时,采用的是https协 ...

  8. HttpUtils工具类 java程序 发起 网络请求

    HttpUtils工具类 用于java程序 发起 网络请求 @Slf4j public class OkHttpUtils {private static final String HTTP_JSON ...

  9. dio设置自定义post请求_Flutter中的http网络请求

    前言 由于刚过完年工作比较紧张,文章已经四周没有更新了,非常抱歉!接下来依然会尽量保持每周更新! 本篇介绍Flutter中网络请求相关api的使用,Flutter在Flutter engine中提供了 ...

最新文章

  1. JFace中Dialog类的使用方法
  2. for循环执行次数_VB考试笔记之循环控制结构部分
  3. Js时间戳转为日期格式
  4. 爬虫 spider09——爬取指定数据,去重复,并存储到mysql
  5. ORACLE坏块检查
  6. sql server 查询重复的数据
  7. javaScript语法基础
  8. vs2013 update5离线升级包下载地址
  9. 一个值得推荐的脑图制作神器!
  10. 新浪微博注册页面的用户体验分析报告(转载)
  11. littlevgl抗锯齿_「VGL」Littlevgl 显示汉字 - seo实验室
  12. [《雪的散文诗》小个子的诗集]2012年8月28日
  13. 关于mysql优化的文章
  14. 论文研读-多目标自适应memetic算法
  15. UbuntuNAT内网穿透实现远程访问
  16. Mac 配置 docker 基本操作
  17. Vue小demo—美团注册页面
  18. 一份大厂出来的创业公司cto的创业心得
  19. trheejs中常用灯光总结
  20. 介绍胶囊网络 capsule networks

热门文章

  1. 作业3(大作业):python数据分析与应用大作业,对用户用电量数据进行数据处理,包括数据转置、异常数据识别和处理、统计基本统计量(包括峰度、偏度)、按日/周(求和)差分、5%分位数等
  2. html 代码 path,path是什么意思
  3. 加入昇思MindFlow SIG,助力AI流体仿真发展
  4. kettle入门介绍
  5. 微信小程序完整作品---微信商城
  6. 了解CAP(一致性、可用性、分区容错性)
  7. 苹果手机微信怎样设置网络连接服务器地址,微信小程序的网络设置,及网络请求:wx.request(OBJECT)...
  8. Stata:内生变量的交乘项如何处理?
  9. PDF编辑器怎么通过华为手机免费使用?
  10. 风变编程python入门经典100题_风变编程《Python基础语法+爬虫精进》