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

Flutter中使用try-catch处理PHP API请求时的异常问题排查

问题解决思路与方案

核心原因分析

数据成功插入但触发ClientException,说明API请求过程中出现了网络/协议层面的错误,但PHP端已执行插入逻辑(请求到达服务器并处理,响应环节出问题)。常见诱因包括本地地址访问限制、跨域拦截、响应格式不规范、HTTP状态码异常。

具体修复步骤

1. 修正本地API地址(模拟器场景)

如果使用Android模拟器,localhost指向模拟器自身,无法访问电脑本地PHP服务,需替换为:

// Android模拟器专用地址,替代localhost
Uri.parse("http://10.0.2.2/dashboard/help_me/signup.php")

iOS模拟器可直接用localhost,或改用电脑实际IP地址(如192.168.x.x)。

2. PHP端添加CORS跨域头

在signup.php最顶部添加跨域配置,避免Flutter的跨域拦截:

header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");

3. 确保PHP返回标准JSON格式

  • 移除PHP中所有多余输出(调试echo、HTML注释、空白字符),避免破坏JSON结构。
  • 统一返回格式:
    // 注册成功时
    http_response_code(200);
    echo json_encode(["success" => true]);
    
    // 注册失败时
    http_response_code(200);
    echo json_encode(["success" => false]);
    
    必须保证返回内容仅为JSON字符串,无其他冗余内容。

4. 优化Flutter代码逻辑

  • 修正字段非空判断:原代码用||会导致单个字段非空就提交,改为&&确保必填字段完整。
  • 增加响应状态码检查,避免非200状态码触发异常:
Future<void> signupClient() async {
  if (name.text.isNotEmpty && phone.text.isNotEmpty) {
    try {
      var res = await http.post(
        Uri.parse(ApisConnect.signupApi),
        body: {
          "name": name.text,
          "phone": phone.text,
        }
      );

      if (res.statusCode == 200) {
        var response = jsonDecode(res.body);
        if (response["success"] == true) {
          Fluttertoast.showToast(msg: '注册成功');
        } else {
          Fluttertoast.showToast(msg: '请重试');
        }
      } else {
        Fluttertoast.showToast(msg: '服务器响应异常: ${res.statusCode}');
      }

    } catch (e) {
      Fluttertoast.showToast(msg: '错误: $e');
    }
  } else {
    Fluttertoast.showToast(msg: '请填写完整信息');
  }
}

内容的提问来源于stack exchange,提问作者King Yossef Reda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:33:16