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
相关产品推荐
相关产品推荐

