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进行抓包了。