Flutter Cookie管理插件cookie_jar的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

Flutter Cookie管理插件cookie_jar的使用

CookieJar

Pub GitHub license

CookieJar 是一个用于Dart中HTTP请求的Cookie管理器,帮助处理Cookie策略和持久化。

开始使用

添加依赖

你可以通过命令添加 cookie_jar 作为依赖项:

$ dart pub add cookie_jar

或者你可以在你的 pubspec.yaml 文件中手动添加 cookie_jar

dependencies:
  cookie_jar: ^replace-with-latest-version

最新的版本是:
包括预发布版本的最新版本是:

使用方法

以下是一个简单的使用示例:

import 'package:cookie_jar/cookie_jar.dart';

void main() async {
  final cookieJar = CookieJar();
  List<Cookie> cookies = [Cookie('name', 'wendux'), Cookie('location', 'china')];
  // 保存Cookies
  await cookieJar.saveFromResponse(Uri.parse('https://pub.dev/'), cookies);
  // 获取Cookies
  List<Cookie> results = await cookieJar.loadForRequest(Uri.parse('https://pub.dev/paths'));
  print(results);
}

类介绍

SerializableCookie

这个类是 Cookie 类的包装。由于 Cookie 类不支持Json序列化,为了持久化,我们使用这个类来替代它。

CookieJar

CookieJar 是一个用于HTTP请求的Cookie容器和管理器。

DefaultCookieJar

DefaultCookieJar 是默认的Cookie管理器,实现了RFC标准的Cookie策略。它将Cookies保存在内存中,所有Cookies在应用退出后会被清除。

final cookieJar = CookieJar();

PersistCookieJar

PersistCookieJar 是一个实现了RFC标准Cookie策略的Cookie管理器,它将Cookies持久化到文件中,因此即使应用程序退出,Cookies仍然存在,除非显式调用 delete 方法删除。

// Cookies文件将被保存在"./cookies/4/"目录下
final cookieJar = PersistCookieJar(
  ignoreExpires: true, // 即使Cookies已过期也保存/加载
);

// 在Flutter应用中使用FileStorage时,使用path_provider获取可用目录
Directory tempDir = await getTemporaryDirectory();
final tempPath = tempDir.path;
final cookieJar = PersistCookieJar(
  ignoreExpires: true,
  storage: FileStorage(tempPath),
);

Storage

你可以通过扩展 Storage 来自定义存储方式,详见 FileStorage 的更多细节。

API

  • Future
    为指定的URI保存Cookies。
  • Future<List<Cookie>>
    为指定的URI加载Cookies。
  • Future
    删除指定 uri 的Cookies。此API将删除 uri.host 的所有Cookies,忽略 uri.path
  • Future
    删除所有Cookies。

与HttpClient配合使用

使用 CookieJarPersistCookieJar 管理 HttpClient 请求/响应的Cookies非常简单:

final cookieJar = CookieJar();
request = await httpClient.openUrl(options.method, uri);
request.cookies.addAll(await cj.loadForRequest(uri));
response = await request.close();
await cookieJar.saveFromResponse(uri, response.cookies);

与dio配合使用

dio 是一个强大的Dart/Flutter HTTP客户端,支持全局配置、拦截器、FormData、请求取消、文件上传/下载、超时和自定义适配器等。dio 还支持通过 dio_cookie_manager 使用 cookie_jar 管理Cookies。

import 'package:dio/dio.dart';
import 'package:dio_cookie_manager/dio_cookie_manager.dart';
import 'package:cookie_jar/cookie_jar.dart';

void main() async {
  final dio = Dio();
  final cookieJar = CookieJar();
  dio.interceptors.add(CookieManager(cookieJar));
  await dio.get('https://pub.dev/');
  // 打印Cookies
  print(await cookieJar.loadForRequest(Uri.parse('https://pub.dev/')));
  // 另一个带有Cookies的请求
  await dio.get("https://pub.dev/");
}

更多关于 dio 的详情请参考 dio

示例代码

import 'package:cookie_jar/cookie_jar.dart';
import 'package:path_provider/path_provider.dart';

void main() async {
  final cookies = <Cookie>[
    Cookie('name', 'wendux'),
    Cookie('location', 'china'),
  ];
  final cookiesExpired = <Cookie>[
    Cookie('name', 'wendux')..maxAge = 1,
    Cookie('location', 'china')
      ..expires = DateTime.now().add(const Duration(hours: 1)),
  ];

  Directory tempDir = await getTemporaryDirectory();
  final tempPath = tempDir.path;
  final cj = PersistCookieJar(storage: FileStorage(tempPath));

  await cj.saveFromResponse(Uri.parse('https://www.baidu.com/xx'), cookies);
  List<Cookie> results = await cj.loadForRequest(Uri.parse('https://www.baidu.com/xx'));
  assert(results.length == 2);
  results = await cj.loadForRequest(Uri.parse('https://www.baidu.com/xx/dd'));
  assert(results.length == 2);
  results = await cj.loadForRequest(Uri.parse('https://www.baidu.com/'));
  assert(results.isEmpty);
  await cj.saveFromResponse(Uri.parse('https://google.com'), cookiesExpired);
  results = await cj.loadForRequest(Uri.parse('https://google.com'));
  assert(results.length == 2);
  await Future<void>.delayed(const Duration(seconds: 2), () async {
    results = await cj.loadForRequest(Uri.parse('https://google.com'));
    assert(results.length == 1);
  });
}

以上就是 cookie_jar 插件的基本使用方法和示例代码,希望对您有所帮助。


更多关于Flutter Cookie管理插件cookie_jar的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Cookie管理插件cookie_jar的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于Flutter中cookie_jar插件的使用,这里是一个具体的代码示例,展示了如何在Flutter应用中管理Cookie。cookie_jar插件是一个流行的Flutter库,用于在HTTP请求中管理Cookie。

首先,确保你的pubspec.yaml文件中已经添加了cookie_jar依赖:

dependencies:
  flutter:
    sdk: flutter
  cookie_jar: ^3.0.1  # 请检查最新版本号
  dio: ^4.0.4  # dio 是一个流行的HTTP客户端库,通常与cookie_jar一起使用

然后,运行flutter pub get来安装依赖。

接下来,是一个简单的Flutter应用示例,展示了如何使用cookie_jar来管理Cookie:

import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import 'package:cookie_jar/cookie_jar.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Cookie Jar Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: CookieJarExample(),
    );
  }
}

class CookieJarExample extends StatefulWidget {
  @override
  _CookieJarExampleState createState() => _CookieJarExampleState();
}

class _CookieJarExampleState extends State<CookieJarExample> {
  late Dio _dio;
  late PersistCookieJar _cookieJar;

  @override
  void initState() {
    super.initState();
    // 初始化PersistCookieJar,用于持久化存储Cookie
    _cookieJar = PersistCookieJar(
      dir: './cookies', // 存储Cookie的目录
    );

    // 初始化Dio,并设置Cookie管理器
    _dio = Dio()
      ..options.baseUrl = 'https://example.com' // 替换为你的API基础URL
      ..interceptors.add(CookieManager(_cookieJar));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Cookie Jar Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            try {
              // 发起GET请求
              Response response = await _dio.get('/');
              print('Response data: ${response.data}');
              print('Cookies: ${_cookieJar.loadAllCookies()}');
            } catch (e) {
              print('Error: $e');
            }
          },
          child: Text('Fetch Data and Print Cookies'),
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 初始化PersistCookieJarPersistCookieJar用于持久化存储Cookie,你可以指定一个目录来存储Cookie文件。

  2. 初始化DioDio是一个流行的HTTP客户端库,我们设置它的基础URL,并添加一个CookieManager拦截器,用于管理Cookie。

  3. 发起HTTP请求:在按钮点击事件中,我们发起一个GET请求,并打印响应数据和存储的Cookie。

这个示例展示了如何在Flutter应用中配置和使用cookie_jar插件来管理Cookie。根据具体需求,你可以进一步扩展这个示例,比如处理POST请求、设置自定义Cookie等。

回到顶部