Flutter中通过HTTP请求无法获取原始信息的问题求助
Flutter HTTP请求触发XMLHttpRequest错误的解决方案
这个错误本质是浏览器同源策略导致的CORS跨域限制——当你在Flutter Web环境下发起请求时,浏览器会检查目标服务器的CORS响应头,若服务器未允许你的源访问,就会抛出该错误。以下是几种可行的解决办法:
1. 搭建本地代理服务器(推荐用于开发/生产)
通过代理转发请求,绕过浏览器的CORS检查。以Node.js代理为例:
- 安装依赖:
npm install express http-proxy-middleware
- 创建代理脚本
proxy.js:
const express = require('express'); const { createProxyMiddleware } = require('http-proxy-middleware'); const app = express(); // 转发目标网站的请求 app.use('/brocante', createProxyMiddleware({ target: 'https://calendrier-des-brocantes.com', changeOrigin: true, pathRewrite: { '^/brocante': '' } })); app.listen(3000, () => console.log('代理服务器运行在http://localhost:3000'));
- 修改Flutter请求代码:
Future<void> fetchData() async { final response = await http.get(Uri.parse( 'http://localhost:3000/brocante/vide-greniers-brocante/manche-departement/30-07-2023/')); // 处理响应内容 }
2. 关闭浏览器跨域安全检查(仅开发环境)
启动Flutter Web时添加浏览器参数,临时禁用跨域限制:
flutter run --web-browser-flag "--disable-web-security"
⚠️ 注意:该方法仅用于本地开发调试,绝对不能在生产环境使用。
3. 针对非Web环境的处理
如果你的应用是运行在Android/iOS设备上,不会触发这个错误——移动平台没有浏览器的CORS限制。若需兼容多平台,可通过条件判断切换请求方式:
import 'dart:io'; import 'package:http/http.dart' as http; Future<void> fetchData() async { String url = 'https://calendrier-des-brocantes.com/vide-greniers-brocante/manche-departement/30-07-2023/'; if (Platform.isAndroid || Platform.isIOS) { final response = await http.get(Uri.parse(url)); // 处理响应 } else if (Platform.isWeb) { // 使用代理或其他Web兼容方案 final response = await http.get(Uri.parse('http://localhost:3000/brocante/vide-greniers-brocante/manche-departement/30-07-2023/')); // 处理响应 } }
内容的提问来源于stack exchange,提问作者paul-marie Lariviere
相关产品推荐
相关产品推荐

