flutter中如何通过dio使用系统代理

在Flutter项目中,我正在使用dio库进行网络请求。现在需要让dio走系统的代理设置(比如电脑或手机配置的HTTP/HTTPS代理),但发现默认情况下dio似乎不会自动识别系统代理。请问该如何正确配置dio,使其能自动使用系统级别的代理设置?是否需要通过ProxyController或其他方式手动设置?希望能提供具体的代码示例。

2 回复

在Flutter中使用Dio设置系统代理,可通过以下方式:

  1. 创建代理配置:
(dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate = (client) {
  client.findProxy = (uri) {
    return "PROXY 127.0.0.1:8888;";
  };
};
  1. 支持HTTPS需添加证书:
client.badCertificateCallback = (cert, host, port) => true;

注意:iOS需在Info.plist中配置ATS,Android需配置网络安全策略。

更多关于flutter中如何通过dio使用系统代理的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中使用Dio通过系统代理发送HTTP请求,可以通过以下步骤实现:

  1. 安装依赖

    dependencies:
      dio: ^5.0.0
    
  2. 配置Dio使用系统代理

    import 'package:dio/dio.dart';
    
    void main() async {
      final dio = Dio();
      
      // 获取系统代理设置(适用于移动端和桌面端)
      dio.httpClientAdapter = IOHttpClientAdapter(
        createHttpClient: () {
          final HttpClient client = HttpClient();
          // 启用系统代理(默认已启用,此配置可选)
          client.findProxy = (url) => HttpClient.findProxyFromEnvironment(url);
          return client;
        },
      );
    
      try {
        final response = await dio.get('https://example.com');
        print(response.data);
      } catch (e) {
        print('请求失败: $e');
      }
    }
    

关键点说明

  • HttpClient.findProxyFromEnvironment 会自动读取系统代理设置(如环境变量HTTP_PROXY/HTTPS_PROXY)。
  • 在Android/iOS中,系统代理通常由设备网络设置自动管理,无需额外配置。
  • 在桌面端(Windows/macOS/Linux),会读取系统或终端的代理环境变量。

注意事项

  • 如果代理需要认证,需在请求头中添加Proxy-Authorization
    dio.options.headers['Proxy-Authorization'] = 'Basic ${base64Encode(utf8.encode('username:password'))}';
    
  • 测试时请确保设备/模拟器已正确配置代理。

此方法兼容大部分场景,无需手动指定代理地址。

回到顶部