macOS Android Flutter Dio Https

2022-06-15  本文已影响0人  戴维王

平台、工具

macOS、Charles

步骤

flutter 端获取 proxy

    MethodChannel channel =
        const MethodChannel('flutter_channel_get_proxy_config');
    Future<String> getHost = channel.invokeMethod('getProxyHost');
    Future<String> getPort = channel.invokeMethod('getProxyPort');
    var result = await Future.wait([getHost, getPort]);
    if (result?.length == 2 &&
        (result[0]?.isNotEmpty ?? false) &&
        (result[1]?.isNotEmpty ?? false)) {
      String host = result[0].toString();
      String port = result[1].toString();
      // 将该句中 _dio 替换为项目中 dio 实例
      (_dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
          (HttpClient client) {
        // 设置代理
        client.findProxy = (uri) {
          return "PROXY $host:$port";
        };
        // 信任证书,否则会请求失败
        client.badCertificateCallback = (cert, host, port) {
          return true;
        };

        return client;
      };
    }

Android 端提供 proxy 配置

   class HttpProxyPlugin(messenger: BinaryMessenger): MethodChannel.MethodCallHandler {
       private var channel: MethodChannel? = null

       init {
           channel = MethodChannel(messenger, "flutter_channel_get_proxy")
           channel?.setMethodCallHandler(this)
       }

       override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
           when (call.method) {
               "getProxyHost" -> result.success(getProxyHost())
               "getProxyPort" -> result.success(getProxyPort())
           }
       }

       private fun getProxyHost(): String? {
           return System.getProperty("http.proxyHost")
       }

       private fun getProxyPort(): String? {
           return System.getProperty("http.proxyPort")
       }
   }
上一篇下一篇

猜你喜欢

热点阅读