You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter配置SSL后API响应慢、CachedNetworkImage无法加载HTTPS图片求助

问题分析

你的问题根源出在SSL配置的两个核心错误:

  1. 修改了全局默认SecurityContext,导致所有网络请求(包括CachedNetworkImage依赖的图片加载库)强制使用你指定的证书,而图片服务器的证书不在信任列表内,因此加载失败。
  2. 错误混用证书配置:useCertificateChainBytes用于客户端证书认证(仅当服务器要求客户端提供证书时才需要),如果你的WooCommerce服务器不需要客户端证书,这一步会导致SSL握手反复失败,必须多次重试才可能偶然成功。
正确配置方案

1. 为WooCommerce API创建独立的HttpClient

不要修改全局上下文,只为Woo的请求单独配置SSL,避免影响其他网络操作:

// 单独创建用于WooCommerce请求的HttpClient
Future<HttpClient> createWooHttpClient() async {
  final certificateAsset = await rootBundle.load('assets/WooCertificate.pem');
  final certificateBytes = certificateAsset.buffer.asUint8List();

  // 创建独立的SecurityContext,而非修改全局defaultContext
  SecurityContext securityContext = SecurityContext();
  // 仅添加信任的根证书(适用于服务器证书为自签或私有CA颁发的场景)
  securityContext.setTrustedCertificatesBytes(certificateBytes);
  
  // 只有当服务器明确要求客户端证书时,才保留下面这行,否则直接删除!
  // securityContext.useCertificateChainBytes(certificateBytes);

  // ALPN协议设置先简化,若测试后仍有问题可注释掉,让系统自动协商
  // List<String> alpnProtocols = ['http/1.1'];
  // securityContext.setAlpnProtocols(alpnProtocols, true);

  HttpClient client = HttpClient(context: securityContext);
  return client;
}

2. 修改API请求代码,使用自定义HttpClient

替换原http.get逻辑,改用自定义HttpClient发起请求,脱离全局配置依赖:

Future<products> getProductByCategory(String catId) async {
  late products product_List;
  int maxRetries = 3; // 修复后无需20次重试,3次足够
  int currentRetry = 0;
  final wooClient = await createWooHttpClient();

  while (currentRetry < maxRetries) {
    try {
      Uri uri = Uri.parse(getOAuthURL(
          "GET",
          'https://engy.jerma.net/wp-json/wc/v3/products?category=' +
              catId +
              "&status=publish"));
      
      // 使用自定义HttpClient发起请求
      HttpClientRequest request = await wooClient.getUrl(uri);
      request.headers.set("Content-Type", "Application/json");
      HttpClientResponse response = await request.close().timeout(Duration(seconds: 12));
      
      if (response.statusCode == 200) {
        String responseBody = await utf8.decodeStream(response);
        product_List = products.fromJson(responseBody);
        break;
      }
    } catch (error) {
      currentRetry++;
      // 可选:添加延迟重试,避免频繁请求
      await Future.delayed(Duration(milliseconds: 500));
    }
  }
  
  // 关闭客户端,避免资源泄漏
  wooClient.close();
  return product_List;
}

3. 恢复CachedNetworkImage的正常加载

由于不再修改全局SecurityContext,CachedNetworkImage会使用默认的证书信任机制,只要图片服务器的HTTPS证书是公共CA颁发的合法证书,就能自动恢复加载。若图片服务器也是自签证书,可将其证书合并到你的信任列表,或为图片加载库单独配置SSL上下文。

额外注意事项
  • 确认WooCertificate.pem是根CA证书,而非服务器证书。如果是服务器证书,需转换为PEM格式的CA证书才能正确信任。
  • 若服务器不需要客户端证书,务必删除useCertificateChainBytes代码,这是导致握手失败的核心原因之一。
  • 测试ALPN协议:若注释掉ALPN设置后请求正常,说明服务器不支持你指定的协议组合,建议只保留http/1.1或直接删除ALPN配置,让系统自动协商。

内容的提问来源于stack exchange,提问作者Hassan Ali Hassan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 04:46:21