Flutter中使用Dio配置并切换代理发送请求的方法
Dio代理配置与按需切换方案
一、核心说明
Dio的ProxyAdapter完全适配你的需求,不管是带账号密码认证的代理,还是普通代理都能处理,是官方推荐的代理配置方式。
二、具体实现步骤
1. 解析代理字符串
先把你手里的IP:port:login:password格式的代理字符串,拆分成Dio需要的独立参数:
// 解析单个代理字符串的工具函数 Map<String, String> parseProxy(String proxyStr) { final segments = proxyStr.split(':'); return { 'ip': segments[0], 'port': segments[1], 'username': segments[2], 'password': segments[3], }; }
2. 编写代理切换函数
给Dio实例动态替换代理适配器,实现按需切换:
import 'package:dio/dio.dart'; import 'package:dio/adapter.dart'; // 初始化全局Dio实例(也可以根据需求创建局部实例) final dio = Dio(); // 切换代理的核心函数 void setProxy(String proxyStr) { final proxyData = parseProxy(proxyStr); // 创建新的代理适配器 final proxyAdapter = ProxyAdapter(); // 设置代理地址,格式为 http://[IP]:[端口] proxyAdapter.setProxy('http://${proxyData['ip']}:${proxyData['port']}'); // 配置代理认证(你的代理带账号密码,必须加这一步) proxyAdapter.authentication = BasicAuth( username: proxyData['username']!, password: proxyData['password']!, ); // 给Dio替换成新的代理适配器 dio.httpClientAdapter = proxyAdapter; }
3. 按流程执行请求
按照你期望的“切换代理→发请求→处理→再切换”流程执行:
void main() async { // 你的代理列表 final proxyList = [ '123.45.67.89:8080:korea_user1:pass_123', '98.76.54.32:3128:korea_user2:pass_456', ]; try { // 第一步:用第1个代理发请求 setProxy(proxyList[0]); var res1 = await dio.get('https://your-target-api.com/get-data'); print('代理1请求结果: ${res1.data}'); // 这里可以插入响应处理、延迟等操作 await Future.delayed(const Duration(seconds: 2)); // 第二步:切换到第2个代理发请求 setProxy(proxyList[1]); var res2 = await dio.post('https://your-target-api.com/post-data', data: {'content': 'test'}); print('代理2请求结果: ${res2.data}'); // 后续可以循环或按需继续切换代理... } catch (error) { print('请求失败: $error'); } }
额外提示
- 如果遇到不需要认证的代理,直接删除
proxyAdapter.authentication这一段代码即可。 - 如果需要同时用多个代理发起并发请求,可以创建多个Dio实例,每个实例绑定不同的代理适配器,互不干扰。
内容的提问来源于stack exchange,提问作者egoist
相关产品推荐
相关产品推荐

