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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 23:55:31