React+Redux中Axios发送POST请求时PHP端$_POST参数为空
问题根源与解决办法
这个问题我碰到过好多次啦,核心原因是Axios默认的POST数据格式和PHP的$_POST解析规则不匹配:
Axios发送POST请求时,默认会把参数序列化为JSON格式,同时设置请求头为Content-Type: application/json。但PHP的$_POST超全局变量只会自动解析两种格式的请求数据:
application/x-www-form-urlencoded(普通表单提交的默认格式)multipart/form-data(文件上传场景用)
所以你的JSON格式参数根本不会被PHP解析到$_POST里,这就是后端提示参数未定义的原因。至于GET请求正常,是因为GET参数在URL里,PHP会自动解析到$_GET中,不受这个限制。
下面给你两种可行的解决方案,选一种适合你的就行:
方案一:修改前端代码,发送表单格式数据
把POST参数转换成表单格式,Axios会自动设置正确的请求头,这样PHP的$_POST就能正常读取参数了。修改你的前端函数:
export function postRequest(url) { // 用URLSearchParams构造表单数据 const formData = new URLSearchParams(); formData.append('param_0', 1); formData.append('param_1', 22); // 把你需要的其他参数都用append方法加进去 axios.post(url, formData) .then(response => { console.log(response); }) .catch((err)=>{ console.log("Error on issuing post request"); }) }
如果你的参数是一个现成的对象,也可以用Object.entries批量处理,省得一个个append:
const params = { param_0:1, param_1:22, param_2: /* 你的值 */, // 其他参数 }; const formData = new URLSearchParams(); Object.entries(params).forEach(([key, value]) => formData.append(key, value));
这种方案下,你的原有PHP代码完全不用修改,直接就能用$_POST拿到参数。
方案二:修改PHP后端,解析JSON数据
如果不想改动前端逻辑,那就在PHP里直接读取原始的JSON请求体,解析成数组来用:
// 读取原始的请求体内容 $rawRequest = file_get_contents('php://input'); // 把JSON字符串解析成关联数组 $postData = json_decode($rawRequest, true); // 先判断解析是否成功(如果请求不是有效JSON,json_decode会返回null) if ($postData === null) { http_response_code(400); echo "Invalid request data"; exit; } // 之后把原来代码里的$_POST换成$postData就行 if (isset($postData["param_0"])) { echo "SET!"; } else { echo "it is not set"; } $id = $postData['param_0']; $age = $postData['param_1']; $weight = $postData['param_2']; $weight_si = $postData['param_3']; $height = $postData['param_4']; $height_si = $postData['param_5']; $gender = $postData['param_6']; $race = $postData['param_7']; $stmt = $conn->prepare("INSERT INTO basic_person (id, age, weight, weight_si, height, height_si, gender, race) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); $stmt->bind_param("iiisisss", $id, $age, $weight, $weight_si, $height, $height_si, $gender, $race); $stmt->execute();
这种方案更适合前后端分离的场景,毕竟JSON现在是前后端数据交互的主流格式。
小提醒
两种方案都能解决问题,如果你是和传统PHP项目配合,方案一更贴合PHP的默认处理习惯;如果是现代化的前后端分离项目,方案二更推荐。
内容的提问来源于stack exchange,提问作者EugenSunic
相关产品推荐
相关产品推荐

