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
相关产品推荐
相关产品推荐

