当我们使用 Dio 模拟某个网站登录后,有时需要用 InAppWebView 打开网页,或使用 InAppWebView 打开刚刚登录后,然后用 Dio 去请求网站 Api,这时就需要 Dio 与 InAppWebView 同步 Cookie
// 从 Dio 的 CookieJar 获取 Cookie 并设置到 InAppWebView 中
static Future<void> dioSyncCookie2InApp(String url) async {
final inAppCookieManager = CookieManager.instance();
CookieJar cookieJar = Http.cookieManager!.cookieJar;
List<Cookie> dioCookies = await cookieJar.loadForRequest(Uri.parse(url));
for (var cookie in dioCookies) {
// final expiresDate = DateTime.now().add(Duration(days: 3)).millisecondsSinceEpoch;
await inAppCookieManager.setCookie(
url: WebUri(url),
name: cookie.name,
value: cookie.value,
domain: cookie.domain,
// path: cookie.path!,
path: '/',
// expiresDate: expiresDate,
expiresDate: cookie.expires != null ? cookie.expires!.millisecondsSinceEpoch : null,
isSecure: cookie.secure,
isHttpOnly: cookie.httpOnly,
);
}
}
static Future inAppSyncCookie2Dio(List cookiesList, String url) async {
// 接收 flutter_inappwebview Cookie List
List<Cookie> jarCookies = [];
if (cookiesList.isNotEmpty) {
for (var i in cookiesList) {
Cookie jarCookie = Cookie(i.name, i.value);
jarCookies.add(jarCookie);
}
}
var cookieString = jarCookies.map((cookie) => '${cookie.name}=${cookie.value}').join('; ');
await Http.cookieManager!.cookieJar.saveFromResponse(Uri.parse(url), jarCookies);
Http.dio.options.headers['cookie'] = cookieString;
}