如何将带Cookie与Referer的wget命令转为Flutter的dio/http请求?
将WGET批处理脚本转换为Flutter Dio实现
需求背景
现有Windows批处理脚本通过WGET命令实现带Cookie和Referer的自动文件下载,需要转换为Flutter中使用Dio的实现,已完成证书忽略配置,需补充Cookie和Referer的处理逻辑。
原WGET命令
bin\wget.exe --no-check-certificate --post-data="Login=xxx&Password=yyy" --save-cookies="cookies.txt" --keep-session-cookies "https://10.0.0.1/Login" bin\wget.exe --no-check-certificate --load-cookies cookies.txt "https://10.0.0.1/Filebrowser?Path=/files/file.csv&RAW" --referer="https://10.0.0.1/Portal/Portal.mwsl?PrNa=Filebrowser&Path=/file/" -O %{output_folder}%\file.csv
已实现的Dio证书忽略配置
(dio.httpClientAdapter as IOHttpClientAdapter).onHttpClientCreate = (HttpClient dioClient) { dioClient.badCertificateCallback = ((X509Certificate cert, String host, int port) => true); return dioClient; };
完整Dio实现方案
方式一:使用Cookie管理器插件(推荐)
通过dio_cookie_manager和cookie_jar插件自动管理Cookie,无需手动处理Cookie的存储与携带,逻辑更简洁。
- 添加依赖到
pubspec.yaml:
dependencies: dio: ^5.4.0+1 dio_cookie_manager: ^2.1.0 cookie_jar: ^4.0.1
- 完整代码实现:
import 'dart:io'; 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.httpClientAdapter as IOHttpClientAdapter).onHttpClientCreate = (HttpClient dioClient) { dioClient.badCertificateCallback = ((X509Certificate cert, String host, int port) => true); return dioClient; }; // 绑定Cookie管理器,自动处理Cookie的保存与携带 dio.interceptors.add(CookieManager(cookieJar)); // 1. 登录请求,自动保存会话Cookie try { await dio.post( 'https://10.0.0.1/Login', data: {'Login': 'xxx', 'Password': 'yyy'}, ); print('登录成功,Cookie已自动保存'); } catch (e) { print('登录失败: $e'); return; } // 2. 带Cookie和Referer下载文件 final outputFolder = '你的输出目录路径'; // 替换为实际路径 final savePath = '$outputFolder\\file.csv'; // 创建输出目录(不存在则自动创建) await Directory(outputFolder).create(recursive: true); try { await dio.download( 'https://10.0.0.1/Filebrowser?Path=/files/file.csv&RAW', savePath, options: Options( headers: { // 设置Referer请求头,对应WGET的--referer参数 'Referer': 'https://10.0.0.1/Portal/Portal.mwsl?PrNa=Filebrowser&Path=/file/', }, ), ); print('文件下载完成,保存至: $savePath'); } catch (e) { print('下载失败: $e'); } }
方式二:手动处理Cookie(无额外依赖)
如果不想添加额外插件,可以手动提取登录响应中的Cookie,在下载请求中手动携带。
完整代码实现:
import 'dart:io'; import 'package:dio/dio.dart'; void main() async { final dio = Dio(); String? cookies; // 配置忽略证书校验 (dio.httpClientAdapter as IOHttpClientAdapter).onHttpClientCreate = (HttpClient dioClient) { dioClient.badCertificateCallback = ((X509Certificate cert, String host, int port) => true); return dioClient; }; // 1. 登录并提取Cookie try { final response = await dio.post( 'https://10.0.0.1/Login', data: {'Login': 'xxx', 'Password': 'yyy'}, ); // 从响应头提取Set-Cookie并拼接 cookies = response.headers.map['set-cookie']?.join('; '); if (cookies == null) { print('登录未返回有效Cookie'); return; } print('登录成功,获取到Cookie'); } catch (e) { print('登录失败: $e'); return; } // 2. 手动携带Cookie并设置Referer下载文件 final outputFolder = '你的输出目录路径'; final savePath = '$outputFolder\\file.csv'; await Directory(outputFolder).create(recursive: true); try { await dio.download( 'https://10.0.0.1/Filebrowser?Path=/files/file.csv&RAW', savePath, options: Options( headers: { 'Cookie': cookies!, 'Referer': 'https://10.0.0.1/Portal/Portal.mwsl?PrNa=Filebrowser&Path=/file/', }, ), ); print('文件下载完成'); } catch (e) { print('下载失败: $e'); } }
关键逻辑说明
- Cookie处理:插件方式通过
CookieManager自动完成Cookie的保存(对应WGET的--save-cookies)和携带(对应--load-cookies);手动方式需提取Set-Cookie头并在后续请求中设置Cookie头。 - Referer设置:通过
Options.headers添加Referer字段,完全对应WGET的--referer参数。 - 文件保存:
dio.download方法直接指定保存路径,对应WGET的-O参数。
内容的提问来源于stack exchange,提问作者enrico c
相关产品推荐
相关产品推荐

