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

Flutter调用PHP登录接口无响应问题排查求助

Flutter调用PHP登录接口无响应问题排查与解决

问题现象

Postman测试PHP登录接口可正常返回"success",但通过Flutter的http库调用时,代码既不进入响应判断逻辑也无打印输出;改用Dio库后仍无响应,移除PHP中的json_encode也未解决问题。

排查与解决步骤

1. 修复网络访问基础问题

  • Android权限配置:在Flutter项目的android/app/src/main/AndroidManifest.xml中添加网络权限:
    <uses-permission android:name="android.permission.INTERNET" />
    
  • 本地服务访问地址修正:若PHP服务部署在本地电脑,不要使用localhost,改用电脑的局域网IP(如http://192.168.1.100/canlidestek/login.php)——Flutter模拟器的localhost指向模拟器自身,而非宿主电脑。
  • 服务器访问权限检查:确认PHP所在服务器的防火墙、Apache/Nginx配置未限制外部访问。

2. 扩展Flutter请求的错误捕获与日志

原代码异常捕获范围有限,添加超时设置与全量日志输出,定位问题根源:

import 'dart:convert';
import 'package:http/http.dart' as http;
import 'dart:async';

// ... 其他代码保持不变
Future<void> fetchLogin() async {
  try {
    // 打印输入参数,确认是否正确获取
    print("输入邮箱: ${email_controller.text},输入密码: ${pass_controller.text}");
    
    // 添加10秒超时,避免无限等待
    final response = await http.post(
      Uri.parse("http://你的局域网IP/canlidestek/login.php"),
      body: {"email": email_controller.text, "password": pass_controller.text},
    ).timeout(const Duration(seconds: 10));

    // 强制打印所有响应信息,不局限于200状态码
    print("响应状态码: ${response.statusCode}");
    print("响应原始内容: ${response.body}");

    if (response.statusCode == 200) {
      try {
        var data = json.decode(response.body);
        print("解析后数据: $data");
      } catch (parseError) {
        print("JSON解析失败: $parseError");
      }
    }
  } catch (e) {
    print("请求异常: $e");
    // 区分超时、网络错误等具体类型
    if (e is TimeoutException) {
      print("请求超时,请检查网络或PHP服务状态");
    }
  }
}

3. 统一PHP接口的响应格式

原PHP接口混合返回纯文本与JSON,易导致Flutter解析异常,统一返回JSON格式并设置正确响应头:

<?php 
session_start();
include_once "config.php";
// 设置标准JSON响应头
header('Content-Type: application/json');

$response = [];
if($_POST){
    $email = $_POST['email'];
    $password = $_POST['password'];
    if(!empty($email) && !empty($password)){
        // 注意:原代码存在SQL注入风险,建议替换为mysqli预处理语句
        $sql = mysqli_query($conn, "SELECT * FROM livesup WHERE email = '{$email}'");
        if(mysqli_num_rows($sql) > 0){
            $row = mysqli_fetch_assoc($sql);

            $status = "Online";
            $sql2 = mysqli_query($conn, "UPDATE livesup SET status = '{$status}' WHERE unique_id = {$row['unique_id']}");
            if($sql2){
                $_SESSION['unique_id'] = $row['unique_id'];
                $response['status'] = 'success';
                $response['message'] = '登录成功';
            }else{
                $response['status'] = 'error';
                $response['message'] = '操作失败,请重试';
            }

        }else{
            $response['status'] = 'error';
            $response['message'] = "$email - 该邮箱不存在";
        }
    }else{
        $response['status'] = 'error';
        $response['message'] = '所有输入字段为必填项';
    }
}else{
    $response['status'] = 'error';
    $response['message'] = '未接收到POST数据';
}
// 统一输出JSON格式响应
echo json_encode($response);
?>

重要提示:原PHP代码存在SQL注入风险,生产环境请使用mysqli预处理语句或PDO绑定参数,避免安全漏洞。

4. 确认请求参数传递正确性

在Flutter发起请求前,打印email_controller.text和pass_controller.text的值,确认输入框内容已正确获取——若参数为空,PHP接口会返回错误信息,导致Flutter端无预期输出。

内容的提问来源于stack exchange,提问作者user20763992

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:35:23