You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将带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的存储与携带,逻辑更简洁。

  1. 添加依赖到pubspec.yaml:
dependencies:
  dio: ^5.4.0+1
  dio_cookie_manager: ^2.1.0
  cookie_jar: ^4.0.1
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 01:25:56