为什么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请求状态码,也没有捕获异常,请求失败后直接崩溃,所以点击登录无响应。
解决步骤
- 先验证接口可用性:用Postman等工具直接调用你的公网API接口,传入对应username、password参数,确认接口可以正常返回标准JSON格式数据,排除服务端路径错误、代码报错的问题。
- 处理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>
- Android端:在
- 优化代码添加容错逻辑:新增状态码校验、空响应校验、异常捕获,同时注意高版本
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
相关产品推荐
相关产品推荐

