PHP Session问题:Fetch POST请求无JSON返回求助
问题排查:POST请求未返回预期JSON,但GET正常
使用fetch发送POST请求到PHP接口时,服务器未返回预期JSON内容,但GET方法访问该文件能正常获取JSON。
相关代码文件
/global/config.php
error_reporting(E_ALL); ini_set('display_errors', 1); if (session_status() === PHP_SESSION_NONE) session_start(); // SMTP const SMTP_HOST = '(something)'; const SMTP_USER = '(something)'; const SMTP_USERNAME = '(something)'; const SMTP_PSW = '(something)'; // LINKS define('DOC_ROOT', $_SERVER['DOCUMENT_ROOT']); const LINK_HOME = '/'; const IMPORT_PATH = DOC_ROOT . LINK_HOME; const LINK_API = LINK_HOME . 'api/'; define('LINK_WEBSITE', $_SERVER['HTTP_HOST'] . LINK_HOME); const APP_NAME = '(something)'; const LOGO = LINK_HOME . '(something)'; const LOGO_WHITE = LINK_HOME . '(something)'; const LOGO_SM = LINK_HOME . '(something)'; const LOGO_SM_WHITE = LINK_HOME . '(something)'; const DEFAULT_AVATAR = LINK_HOME . '(something)'; $page_name = '(Sem nome)'; require_once(IMPORT_PATH . "api/check.php");
/api/check.php
$cur_loc = $_SERVER['REQUEST_URI']; if (!str_contains($cur_loc, LINK_HOME . "api/auth/")) { if (!isset($_SESSION['user']) && !str_contains($cur_loc, LINK_HOME . "pages/auth/")) { header('Location: ' . LINK_HOME . 'pages/auth/login'); exit(); } else if (isset($_SESSION['user']) && $cur_loc !== LINK_HOME . "pages/auth/logout" && str_contains($cur_loc, LINK_HOME . "pages/auth/")) { header('Location: ' . LINK_HOME); exit(); } }
/api/user/edit.php
require_once($_SERVER['DOCUMENT_ROOT'] . '/global/config.php'); header('Content-Type: application/json'); $response = ["status" => "error", "message" => "Método inválido!"]; if ($_SERVER['REQUEST_METHOD'] === 'POST') {} session_write_close(); echo json_encode($response, JSON_THROW_ON_ERROR);
前端脚本
window.addEventListener("DOMContentLoaded", () => { const form = document.querySelector("form#account-profile-details-form"); const btnSubmit = document.querySelector("#account-info-submit"); const validator = FormValidation.formValidation(form, { fields: { 'email': { validators: { notEmpty: { message: 'E-mail é obrigatório' }, emailAddress: { message: 'E-mail inválido' }, invalidEmail: { message: 'E-mail inválido' } } } }, plugins: { trigger: new FormValidation.plugins.Trigger(), bootstrap: new FormValidation.plugins.Bootstrap5({ rowSelector: '.fv-row', eleInvalidClass: '', eleValidClass: '' }) } }); form.onsubmit = (ev) => { ev.preventDefault(); if (validator) { validator.validate().then((status) => { if (status === 'Valid') { btnSubmit.setAttribute('data-kt-indicator', 'on'); btnSubmit.disabled = true; const url = '<?= LINK_API ?>user/edit'; const data = new FormData(form); const options = { method: 'POST', body: data, headers: { Accept: 'application/json' } }; fetch(url, options) .then(res => res.json) .then(res => { console.log(res); }) .catch(err => console.error('Ocorreu um erro!', err)) .finally(() => { btnSubmit.removeAttribute('data-kt-indicator'); btnSubmit.disabled = false; }); } }); } }; });
问题原因及修复方案
1. 前端fetch解析JSON的写法错误
代码中.then(res => res.json)是引用方法而非调用方法,正确写法应为.then(res => res.json())。此错误会导致后续拿到的是函数本身而非解析后的JSON对象,直接引发catch分支报错。
2. 会话验证导致的重定向
查看/api/check.php逻辑:当POST请求到/api/user/edit.php时,若$_SESSION['user']不存在,PHP会发送3xx重定向到登录页,此时前端收到的是登录页HTML而非JSON。
- 检查Network面板的响应状态码,若为3xx则证明会话验证失败;
- 修复:确保POST请求携带有效会话Cookie,或针对API接口调整逻辑,返回JSON格式的未授权错误(如
{"status":"error","message":"未授权"})而非页面跳转。
3. PHP的POST分支未修改响应内容
目前/api/user/edit.php的POST分支为空,无论是否为POST请求,都会返回默认的"Método inválido!"错误。需在POST分支内添加业务逻辑,修改$response的内容。
内容的提问来源于stack exchange,提问作者Luís Guerra
相关产品推荐
相关产品推荐

