Flutter登录触发FormatException,无法跳转至Accpage页面求助
问题解决:登录请求FormatException及服务器响应格式错误
问题根源
你的Flutter代码发送的是JSON格式的请求(已设置Content-Type: application/json并通过jsonEncode传递参数),但PHP后端试图用$_POST获取参数——$_POST仅能解析application/x-www-form-urlencoded或multipart/form-data格式的表单数据,无法读取JSON请求体,导致$login和$pass为空,后续逻辑触发错误甚至输出非JSON内容(比如PHP警告),最终让Flutter解析响应时抛出FormatException。
修复方案
修改PHP代码,改为读取JSON请求体并解码:
<?php // 清空输出缓冲区,避免多余字符干扰JSON格式 ob_clean(); header('Content-Type: application/json'); $msg = json_encode(['message' => 'entered']); try { // 读取JSON请求体并解码为关联数组 $input = file_get_contents('php://input'); $data = json_decode($input, true); if (!$data) { $msg = json_encode(['message' => 'Invalid request format']); echo $msg; exit; } // 从解码后的数据中获取参数,空值兜底 $login = $data['login'] ?? ''; $pass = $data['password'] ?? ''; error_log("***Received login: $login, password: $pass"); if (!$login || !$pass) { $msg = json_encode(['message' => 'Enter your login and password']); } else { $dns = "mysql:host=localhost;dbname=authentif"; $user = "root"; $mdp = ""; $cnx = new PDO($dns, $user, $mdp); $cnx->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $req = $cnx->prepare('select * from utilisateur where login=? and password=?'); $req->execute([$login, $pass]); $res = $req->fetch(PDO::FETCH_ASSOC); if (!$res) { $msg = json_encode(['message' => 'No account found']); } else { $msg = json_encode([ 'message' => 'Login successful', 'user' => [ 'login' => $res['login'], //'photo' => base64_encode($res['image']), ] ]); } } } catch(Exception $e) { $msg = json_encode(['message' => 'Error: ' . $e->getMessage()]); } echo $msg;
额外检查项
- 关闭Wampserver的PHP页面错误输出(在php.ini中设置
display_errors = Off),仅通过error_log记录错误,避免多余字符破坏JSON结构。 - 确认Flutter请求的IP
192.168.56.1是Wampserver所在机器的正确内网IP,且/app_data/data.php文件路径无误。
内容的提问来源于stack exchange,提问作者BenAmar Mayssa
相关产品推荐
相关产品推荐

