dio网络请求库使用系统代理

起因

因为项目中使用了firebase storage存储文件,当使用dio下载时发现国内的网络无法正常下载。
但是发现在dio的HttpClient示例的findProxy写死代理地址之后就可以下载。
这说明dio并没有使用系统的代理,所以需要获取系统代理并设置到dio的代理中。

具体实现

需要用到的dart包:http_proxy_override
主要分为两步,即获取系统代理和设置dio代理,建议只有开发和调试环境启用,防止其他人抓包后攻击程序接口。

1、获取系统设置的代理

// 获取系统代理,支持抓包
HttpProxyOverride? httpProxyOverride;
// 默认是直连
String proxy = "DIRECT";

// 在app初始化的时候调用
Future<void> initProxy() async {
    // 只会获取一次
    httpProxyOverride ??= await HttpProxyOverride.createHttpProxy();
    // 下面的代码可以将代理设置到全局
    // HttpOverrides.global = httpProxyOverride;
    if (httpProxyOverride?.host != null) {
        proxy = "PROXY ${httpProxyOverride?.host}:${httpProxyOverride?.port}";
    } else {
        // 没有就是直连
      proxy= "DIRECT";
    }
}

2、为dio设置代理

final dio = Dio();
dio.httpClientAdapter = IOHttpClientAdapter(
    // 因为这里有uri,所以也可以针对某些uri实现代理,其他的使用直连
    createHttpClient: () => HttpClient()..findProxy = (uri) => proxy,
);

3、测试

可以通过dio.download来测试,代理是否已经生效了。

扩展阅读

当然这样设置之后,将系统代理地址设置为charles的地址,也就可以使用Charles进行抓包了。

留下回复