You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动