首页 > 其他分享 >Flutter 使用dio来发起网络请求以及Cookie管理

Flutter 使用dio来发起网络请求以及Cookie管理

时间:2023-06-05 11:02:20浏览次数:48  
标签:cookies dio cookieJar dart cookie print Cookie Flutter

前言

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

来源:思否

标签:cookies,dio,cookieJar,dart,cookie,print,Cookie,Flutter
From: https://www.cnblogs.com/clark1990/p/17457280.html

相关文章

  • Flutter依赖注入
    依赖注入依赖注入(DependencyInjection,简称DI)是一种软件设计模式,它的主要目的是将对象之间的依赖关系解耦,使得代码更加可维护、可测试、可扩展,使得代码更易于维护和测试。在Flutter中,DI可以帮助我们管理应用程序中的各种依赖关系,包括服务、数据存储和UI组件等。在DI模式中,我们将......
  • Python爬虫入门六之Cookie的使用
     大家好哈,上一节我们研究了一下爬虫的异常处理问题,那么接下来我们一起来看一下Cookie的使用。为什么要使用Cookie呢?Cookie,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个......
  • flutter学习笔记(二)
    flutter一切皆widgetflutter和web前端的区别:1.js语法变成dart2.html标签变成组件widget3.flutter里没有css,只有各种widget的属性来实现样式(比如绝对定位用Stack组件来实现)fluter和web前端的相同点:1.dart语法接近js2.flutter里也可以实现flex弹性布局,用Expanded来实现(Expand......
  • Side by Side 1, Third Edition [Longman] + AUDIO
    SidebySide1,ThirdEdition[Longman]+AUDIOLevel:BeginnerA1Описание:SidebySide,ThirdEdition,byStevenJ.MolinskyandBillBliss,isadynamic,all-skillsprogramthatintegratesconversationpractice,reading,writing,andlistening—al......
  • 从iReport到Jaspersoft Studio
    从5.5版本开始,JaspersoftStudio将取代iReport成为JasperReports官方设计器。iReport维护截止日期到2015年底,意味着不会再有新的功能增加进iReport,但会做一些关键bug的修复、更新。所幸的是基于eclipse的JaspersoftStudio同样开源、免费!Yeah!JaspersoftStudio是一个专为Jasper......
  • 从iReport到Jaspersoft Studio
    从5.5版本开始,JaspersoftStudio将取代iReport成为JasperReports官方设计器。iReport维护截止日期到2015年底,意味着不会再有新的功能增加进iReport,但会做一些关键bug的修复、更新。所幸的是基于eclipse的JaspersoftStudio同样开源、免费!Yeah!JaspersoftStudio是一个专为Jasper......
  • flutter 使用 http 请求数据
    flutter虽然有原生的HttpClient,package:http对开发会更友好,这是官方推荐的网络请求模块。安装httppackagefluterpubaddhttp在android文件夹下的AndroidManifest.xml文件,添加网络权限,<uses-permissionandroid:name="android.permission.INTERNET"/>构造URI因为ht......
  • Flutter灵活布局要掌握的两个控件Expanded和Flexible
    Expanded和Flexible介绍在Flutter中,Expanded和Flexible是两个用于控制子组件尺寸的Widget,它们都可以用于实现灵活的布局。ExpandedWidget会自动将子组件的尺寸扩展到父组件剩余的空间,而FlexibleWidget则会自动调整子组件的尺寸以适应父组件的尺寸。具体来说,ExpandedWidget......
  • 整合ChatGPT与Flutter高级技术
    整合ChatGPT与Flutter高级技术在当今快节奏的数字时代,人们对智能化应用的需求越来越高。ChatGPT是一种基于人工智能的语言模型,而Flutter是一种快速开发移动应用程序的框架。本文将介绍如何将这两种技术整合在一起,从而为用户提供更好的智能化移动应用体验。ChatGPT概述ChatGPT(Genera......
  • FL Studio 21 终身免费升级高级完整解锁版已经到来啦,fl 21配置要求语言切换
    说到制作电音的软件,兔八哥爱分享一定会把FLStudio放到第一个来讲。水果是一款为了电子音乐而生的的宿主软件。水果,独特的节拍音序器组件和通道机架与混音台模块打造的编曲“块”的思路。是极为适合于电子音乐的编排。而且随着水果版本不断地升级,现在不仅只适用于电子音乐,也可以完......