Flutter Web请求000webhost服务器失败,求助解决HTTP错误
Flutter Web 请求000webhost接口失败的排查与解决
我来帮你搞定这个问题!你的两个请求逻辑完全一致,但目标服务的环境差异导致了失败——大概率是跨域限制或者000webhost的安全策略在搞鬼,下面是一步步的解决思路:
1. 优先解决CORS跨域问题(最常见原因)
Flutter Web运行在浏览器环境下,受到同源策略约束。000webhost默认没有开启跨域支持,浏览器会先发送一个OPTIONS预检请求,如果服务器没正确响应,就会直接阻止后续的GET请求。
你需要在你的fetchData.php脚本开头添加跨域响应头:
<?php // 允许所有域名访问(开发环境用,生产环境建议替换成你的Flutter Web域名) header("Access-Control-Allow-Origin: *"); // 允许的请求方法 header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); // 允许的请求头 header("Access-Control-Allow-Headers: Content-Type, Accept"); // 你的原有业务代码... ?>
2. 优化Flutter请求的请求头
000webhost的安全机制可能会拦截看起来像“非浏览器”的请求,同时补充标准请求头也能避免格式不匹配问题,调整你的请求代码:
// 修正方法名(注意你两个方法重名了,建议改成区分性命名) getMethod000webhost() async { print("IN GET FROM 000WEBHOST ...."); String theUrl = 'https://funholidayshotels.000webhostapp.com/fetchData.php'; var res = await http.Client().get( Uri.encodeFull(theUrl), headers: { "Accept": "application/json", "Content-Type": "application/json", // 模拟浏览器的User-Agent,规避主机的爬虫拦截 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" }, ); // 先打印状态码和原始响应体,精准排查问题 print("Status Code: ${res.statusCode}"); print("Raw Response: ${res.body}"); // 包裹异常处理,避免JSON解码失败导致崩溃 try { var responseBody = json.decode(res.body); print(responseBody); return responseBody; } catch (e) { print("JSON解码失败: $e"); return null; } }
3. 关键排查步骤
在调整代码后,通过打印的信息快速定位问题:
- 如果状态码是
403:说明000webhost的安全策略拦截了请求,检查主机后台是否开启防盗链,或者请求频率是否超限 - 如果状态码是
404:确认fetchData.php的路径是否正确,直接在浏览器访问这个URL验证可用性 - 如果状态码是
200但JSON解码失败:说明PHP脚本输出的不是合法JSON,检查PHP是否有语法错误,或者输出了多余字符(比如空格、HTML错误页面)
4. 额外注意事项
- 000webhost免费版有请求次数限制,测试频繁可能会被临时拦截,可过段时间再试
- 你两个方法重名了,记得修改方法名避免代码冲突(比如第一个叫
getMethodPlaceholder,第二个叫getMethod000webhost)
内容的提问来源于stack exchange,提问作者Norbert




