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

Flutter无法发起HTTPS请求求助:原HTTP正常,Postman可正常调用

HTTPS API调用XMLHttpRequest错误排查方案

1. 证书信任问题

服务器用IP地址提供HTTPS服务时,SSL证书大概率是绑定域名的,Postman会自动跳过部分证书校验,但Flutter的http客户端默认严格校验证书,这是常见报错原因。

  • 测试环境临时调试:可以禁用证书校验(生产环境绝对禁止使用),示例代码如下:
    import 'dart:io';
    import 'package:http/http.dart' as http;
    
    class MyHttpClient extends http.BaseClient {
      final HttpClient _client = HttpClient()
        ..badCertificateCallback =
            ((X509Certificate cert, String host, int port) => true);
    
      @override
      Future<http.StreamedResponse> send(http.BaseRequest request) {
        return _client.send(request).then((value) => http.StreamedResponse(
              value.stream,
              value.statusCode,
              headers: value.headers,
              reasonPhrase: value.reasonPhrase,
              isRedirect: value.isRedirect,
              persistentConnection: value.persistentConnection,
              contentLength: value.contentLength,
            ));
      }
    }
    
    // 使用自定义客户端发请求
    final response = await MyHttpClient().post(
      Uri.https('8.8.8.808:8081', 'cms/district_list'),
      headers: globals.POST_httpHeaders(map),
      body: map,
    );
    
  • 生产环境解决方案:要么给服务器SSL证书添加该IP地址的SAN字段,要么改用证书绑定的域名访问API。

2. 端口与HTTPS服务配置不匹配

HTTPS默认端口是443,你用的是8081,得确认服务器在8081端口正确配置了HTTPS服务:

  • 检查Nginx/Apache等Web服务器的SSL配置,确保8081端口监听的是HTTPS流量,比如Nginx配置片段:
    server {
        listen 8081 ssl;
        server_name your-domain.com;
    
        ssl_certificate /path/to/your/cert.pem;
        ssl_certificate_key /path/to/your/private.key;
    
        # 其他SSL相关配置...
    }
    

3. CORS配置缺失(针对Flutter Web场景)

Postman不受CORS限制,但Flutter Web运行在浏览器环境下会受影响,需服务器配置正确的CORS响应头:

  • 确保服务器返回CORS相关头,比如允许你的前端域名跨域:
    add_header Access-Control-Allow-Origin "https://your-frontend-domain.com";
    add_header Access-Control-Allow-Methods "POST, GET, OPTIONS, PUT, DELETE";
    add_header Access-Control-Allow-Headers "Content-Type, Authorization";
    
  • 同时要保证服务器能正确响应OPTIONS预检请求,返回200状态码。

4. URL构造格式验证

可以打印当前代码生成的URL,确认是否为https://8.8.8.808:8081/cms/district_list,也可以换用Uri.parse直接构造URL,避免格式问题:

final url = Uri.parse('https://8.8.8.808:8081/cms/district_list');
final response = await http.post(url, headers: globals.POST_httpHeaders(map), body: map);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 12:22:51