Dio dart/Flutter获取和设置cookie

ldxq2e6h  于 2023-05-01  发布在  Flutter
关注(0)|答案(2)|浏览(605)

我想做一个设置cookie,做一个获取请求,然后获取cookie。在Python中,它将是这样的:

> import requests cookies = {'status': 'working','color':'blue'}
> response = session.get('https://google.com/', cookies=cookies)
> print(session.cookies.get_dict())

你知道怎么抖吗?我尝试了类似的东西,但它似乎没有一个cookie在响应和cookie似乎没有被发送

Map<String, String> headers = {
      "status":"working",
      "color":"blue"   
    };
    final BaseOptions dioBaseOptions = BaseOptions(
    baseUrl: 'https://google.com',
    headers: {
      'Cookie': headers,
    },
    );
     dio = Dio(dioBaseOptions);
  var cookieJar=CookieJar();
  dio.interceptors.add(CookieManager(cookieJar));
var response = await dio.get('https://google.com/');
zrfyljdw

zrfyljdw1#

Cookie由服务器在响应标头中设置,浏览器在请求标头中将其发回。
在接收到HTTP请求后,服务器可以发送一个或多个Set-Cookie报头和响应。浏览器通常存储cookie并将其与向同一服务器发出的请求一起发送到Cookie HTTP头中。
详情请参见Using HTTP cookies
CookieManagerdio和Flutter执行此操作。
在dio响应中访问Cookie

final cookies = response.headers['set-cookie']
k3bvogb1

k3bvogb12#

根据您使用Flutter Web或移动的设备的情况,有不同的方式来获取Cookie
对于Flutter Web,您只需:

  • 在前面设置凭据为true
  • 在我例子中,在服务器的头文件中添加“'Access-Control-Allow-Credentials',true”,我在后端使用Dart(Alfred框架)
  • 检查您的服务器的来源是否与您的主机匹配:前面的端口

您的浏览器将完成这项工作并自动重新发送您的Cookie。
你可以定义一个特定的端口时启动应用程序这个命令-“flutter run -d chrome --web-port 5555”
但对于移动的你必须使一些技巧
我使用Dio包来轻松定义onResponse/onRequest函数和条件导入,以避免编译失败。(遗憾的是,withCredentials选项仅在Web上可用)
如果要使用默认的http类
您只需创建自己的onResponse/onRequest函数

**NetworkConfig。 dart **

import 'package:dio/dio.dart';

import '../../../constants/url_paths.dart';
import 'get_net_config.dart'
    if (dart.library.io) 'mobile_net_config.dart'
    if (dart.library.html) 'web_net_config.dart';

class NetworkConfig {
  final _client = getClient()
    ..options = BaseOptions(
      baseUrl: url,
      connectTimeout: const Duration(seconds: 5),
      receiveTimeout: const Duration(seconds: 6),
    );

  Dio get client => _client;

  final Map<String, String> headers = <String, String>{
    'Content-Type': 'application/json'
  };
}
  • 我使用另一个类来做我的get,post。..扩展NetworkConfig*
    **get_network_config。 dart **
import 'package:dio/dio.dart';

    Dio getClient() => throw UnsupportedError('[Platform ERROR] Network client');

**web_network_config。 dart **

import 'package:dio/browser.dart';
import 'package:dio/dio.dart';

Dio getClient() =>
    Dio()..httpClientAdapter = BrowserHttpClientAdapter(withCredentials: true);

**移动的_network_config。 dart **

import 'dart:io';
import 'package:<projet_name>/data/data.dart';
import 'package:dio/dio.dart';

// CLIENT
Dio getClient() => Dio()
  ..interceptors.add(InterceptorsWrapper(
    onRequest: (options, handler) async {
      options.headers['cookie'] = await localData.read('cookie');

      return handler.next(options);
    },
    onResponse: (response, handler) {
      response.headers.forEach((name, values) async {
        if (name == HttpHeaders.setCookieHeader) {
          final cookieMap = <String, String>{};

          for (var c in values) {
            var key = '';
            var value = '';

            key = c.substring(0, c.indexOf('='));
            value = c.substring(key.length + 1, c.indexOf(';'));

            cookieMap[key] = value;
          }

          var cookiesFormatted = '';

          cookieMap
              .forEach((key, value) => cookiesFormatted += '$key=$value; ');

          await localData.write('cookie', cookiesFormatted);

          return;
        }
      });

      return handler.next(response);
    },
  ));

localData是flutter_secure_storage的 Package 器(在本地保存cookie)

如果使用默认的Client()类,还可以像这样设置凭据

import 'package:http/http.dart';

Client getClient() => BrowserClient()..withCredentials = true;

相关问题