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

Flutter模拟器调用带自签名证书的本地REST API失败求助

解决Flutter模拟器访问本地自签名证书API的问题

1. 修正Uri构造的错误

你的代码里Uri.https(requestUrl)的用法有误,Uri.https第一个参数是主机名(含端口),第二个参数是接口路径。假设你的serverUrl为localhost:8080,正确写法如下:

Future<http.Response> makeHttpRequest(String method, String uri, {dynamic body}) async {
  // 正确构造请求Uri
  final Uri requestUri = Uri.https('localhost:8080', uri);

  http.Response response;
  if (method == 'POST') {
    response = await http.post(requestUri, body: body);
  } else {
    response = await http.get(requestUri);
  }

  return response;
}

如果serverUrl已包含主机和端口,也可以直接用Uri.parse('$serverUrl/$uri')构造,避免参数混淆。

2. 修正模拟器访问本地主机的地址

模拟器的localhost指向自身,无法直接访问主机服务,需根据平台调整地址:

  • Android模拟器:用10.0.2.2替换localhost,即10.0.2.2:8080
  • iOS模拟器:可直接使用localhost:8080

结合平台判断的代码示例(需导入dart:io):

import 'dart:io';

Future<http.Response> makeHttpRequest(String method, String uri, {dynamic body}) async {
  String host = Platform.isAndroid ? '10.0.2.2:8080' : 'localhost:8080';
  final Uri requestUri = Uri.https(host, uri);

  http.Response response;
  if (method == 'POST') {
    response = await http.post(requestUri, body: body);
  } else {
    response = await http.get(requestUri);
  }

  return response;
}

3. 处理自签名证书的信任问题

Flutter的http包默认拒绝自签名证书,有两种解决方式:

方法一:跳过证书验证(仅开发环境用)

通过自定义HttpClient忽略证书校验,适合快速调试:

import 'dart:io';
import 'package:http/http.dart' as http;

Future<http.Response> makeHttpRequest(String method, String uri, {dynamic body}) async {
  String host = Platform.isAndroid ? '10.0.2.2:8080' : 'localhost:8080';
  final Uri requestUri = Uri.https(host, uri);

  // 创建忽略证书的HttpClient
  final HttpClient httpClient = HttpClient()
    ..badCertificateCallback = (X509Certificate cert, String host, int port) => true;

  final http.IOClient client = http.IOClient(httpClient);
  http.Response response;

  try {
    if (method == 'POST') {
      response = await client.post(requestUri, body: body);
    } else {
      response = await client.get(requestUri);
    }
  } finally {
    client.close();
  }

  return response;
}

⚠️ 注意:此方法仅用于开发,生产环境绝对不能使用,会引发安全风险。

方法二:安装自签名证书到模拟器(推荐)

  1. 导出自签名证书为PEM格式(如cert.pem)
  2. Android模拟器:将证书推送到/system/etc/security/cacerts/目录(需root),或在模拟器设置的安全选项手动安装
  3. iOS模拟器:将证书拖入模拟器,在「设置-通用-关于本机-证书信任设置」中启用信任

配置完成后,http包可正常信任自签名证书,无需修改代码跳过验证。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 01:57:20