Flutter调用本地API遇FormatException及断言失败问题求助
Flutter调用本地API出现FormatException错误排查
调用本地API地址127.0.0.1/app/sanjhapizza/lib/userLogin.php时收到FormatException错误,报错信息如下:
Exception:FormatException: //127.0.0.1/app/sanjhapizza/lib/userLogin,Api result:failed,Error: Assertion failed
以下是用户提供的API调用代码:
import 'dart:convert'; import "package:http/http.dart" as http; Future<String> userLogin(String userid) async { try { String ulink = "http://127.0.0.1/app/sanjhapizza/lib/userLogin.php"; final response = await http.post(Uri.http(ulink), body: {"userid": userid}); print('Response status: ${response.statusCode}'); print('Response body: ${response.body}'); } on Exception catch (e) { print("Exception:$e"); return ("failed"); } }
问题核心
Uri.http()方法的用法错误。这个方法需要分开传入主机地址和路径,不能直接把完整的http://开头的URL传进去,否则会导致URL解析格式混乱,触发FormatException。
修复方案
有两种简单的修复方式,选其一即可:
方式1:拆分主机和路径调用Uri.http()
import 'dart:convert'; import "package:http/http.dart" as http; Future<String> userLogin(String userid) async { try { // 拆分主机和路径 final host = "127.0.0.1"; final path = "/app/sanjhapizza/lib/userLogin.php"; final response = await http.post(Uri.http(host, path), body: {"userid": userid}); print('Response status: ${response.statusCode}'); print('Response body: ${response.body}'); // 补充原代码缺失的返回值 return response.body; } on Exception catch (e) { print("Exception:$e"); return "failed"; } }
方式2:用Uri.parse()直接解析完整URL(更直观)
import 'dart:convert'; import "package:http/http.dart" as http; Future<String> userLogin(String userid) async { try { String ulink = "http://127.0.0.1/app/sanjhapizza/lib/userLogin.php"; // 用Uri.parse替代Uri.http,直接解析完整URL final response = await http.post(Uri.parse(ulink), body: {"userid": userid}); print('Response status: ${response.statusCode}'); print('Response body: ${response.body}'); // 补充原代码缺失的返回值 return response.body; } on Exception catch (e) { print("Exception:$e"); return "failed"; } }
额外提示
- 如果在真机上测试,
127.0.0.1指向的是设备自身,需要换成电脑的局域网IP(比如192.168.x.x) - 确保本地API服务正常运行,若API不是用默认80端口,要在URL里加上端口号(比如
http://127.0.0.1:8080/...) - 原代码
try块末尾缺少返回值,会触发编译错误,修复后的代码已补充返回逻辑
内容的提问来源于stack exchange,提问作者Raman Thakur
相关产品推荐
相关产品推荐

