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

为什么Flutter应用的HTTP POST请求仅localhost可用,换公网API报错?

报错根因

你遇到的FormatException: Unexpected end of input报错本质是JSON解析器拿到了空的输入内容,说明你请求公网接口后返回的response.body是空值,无法解析为JSON格式。
导致这个问题的常见原因如下:

  • 明文HTTP请求被系统拦截:Flutter 2.0+默认禁止Android、iOS端使用HTTP明文请求,仅允许HTTPS请求,你的公网接口如果还是http协议,请求会被直接拦截,返回空响应。
  • 接口本身异常:公网部署的接口路径错误、PHP代码运行报错、参数校验逻辑和本地不一致,导致接口返回空内容或者非JSON格式的错误信息。
  • 代码缺少容错处理:原代码没有校验HTTP请求状态码,也没有捕获异常,请求失败后直接崩溃,所以点击登录无响应。
解决步骤
  1. 先验证接口可用性:用Postman等工具直接调用你的公网API接口,传入对应username、password参数,确认接口可以正常返回标准JSON格式数据,排除服务端路径错误、代码报错的问题。
  2. 处理HTTP明文限制(优先把接口升级为HTTPS,这是最规范的方案):如果一定要使用HTTP协议,需要给双端配置明文请求权限:
    • Android端:在android/app/src/main/res/xml目录下新建network_security_config.xml,写入如下配置:
      <?xml version="1.0" encoding="utf-8"?>
      <network-security-config>
          <base-config cleartextTrafficPermitted="true" />
      </network-security-config>
      
      然后在AndroidManifest.xml的application标签中添加属性:android:networkSecurityConfig="@xml/network_security_config"
    • iOS端:在项目的Info.plist文件中添加如下配置:
      <key>NSAppTransportSecurity</key>
      <dict>
          <key>NSAllowsArbitraryLoads</key>
          <true/>
      </dict>
      
  3. 优化代码添加容错逻辑:新增状态码校验、空响应校验、异常捕获,同时注意高版本http包需要传入Uri类型的地址,不能直接传字符串,修改后的参考代码如下:
Future<List> _login() async {
  try {
    final response = await http.post(
      // 替换为你的公网接口地址,必须用Uri.parse包裹
      Uri.parse("https://你的公网域名/login.php"),
      body: {
        "username": user.text,
        "password": pass.text,
      },
    );
    // 先判断请求状态码是否正常
    if (response.statusCode == 200) {
      String body = response.body.trim();
      // 排除空响应
      if (body.isEmpty) {
        setState(() {
          msg = "接口返回空数据,请检查服务端配置";
        });
        return [];
      }
      var datauser = json.decode(body);
      // 原有逻辑不变
      if (datauser.length == 0) {
        setState(() {
          msg = "登录失败";
        });
      } else {
        if (datauser[0]['level'] == 'admin') {
          Navigator.pushReplacementNamed(context, '/AdminPage');
        } else if (datauser[0]['level'] == 'member') {
          Navigator.pushReplacementNamed(context, '/MemberPage');
        }
        setState(() {
          username2 = datauser[0]['name'];
        });
      }
      return datauser;
    } else {
      setState(() {
        msg = "请求失败,错误码:${response.statusCode}";
      });
      return [];
    }
  } catch (e) {
    // 捕获所有异常,避免崩溃
    setState(() {
      msg = "登录出错:$e";
    });
    return [];
  }
}

内容的提问来源于stack exchange,提问作者Dương Tùng Anh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:54:06