HttpClient 默认不使用代理【Dart 】
前言
最近使用 flutter 构建 App,涉及到网络请求部分,使用了 dart 自带的 HttpClient 库发现了一个有趣的问题,dart 默认情况下不使用代理,即使电脑开着代理。
解决方案
HttpClient 有个 findProxy 方法,复写这个方法就是设置代理,因此只需要在请求之前设置代理就可以了。
findProxy
HttpClient client = HttpClient();
client.findProxy = (uri) {
return "PROXY localhost:3128;";
};
但是显然在开发过程中我们并不清楚代理具体的 ip 和端口,所以为了提高可用性,需要一个方法帮助我们发现系统代理。
发现系统代理
flutter 有现成的三方 package-system_proxy 可以帮助获取代理。
安装 system-proxy
在 pubspec.yaml 中添加依赖
system_proxy: ^0.0.1
使用
Map<String, String> proxy = await SystemProxy.getProxySettings();
if (proxy != null) {
print('proxy $proxy');
}
优化代码
成功安装完需要的 package 之后,优化一下代码,使得在请求之前使用系统代理。
extension HttpClientExtension on HttpClient {
Future<HttpClient> autoProxy() async {
Map<String, String> sysProxy = await SystemProxy.getProxySettings();
var proxy = "DIRECT";
if (sysProxy != null) {
proxy = "PROXY ${sysProxy['host']}:${sysProxy['port']}; DIRECT";
print("find proxy $proxy");
}
this.findProxy = (uri) {
return proxy;
};
return this;
}
}
/// 使用方法
var httpClient = await new HttpClient().autoProxy();
/// 逻辑