
PHP 的 $_POST 超全局变量仅自动解析 application/x-www-form-urlencoded 和 multipart/form-data 类型的请求体,无法直接获取 application/json 请求中的数据;需通过 php://input 流读取原始 JSON 并手动解码。
php 的 `$_post` 超全局变量仅自动解析 `application/x-www-form-urlencoded` 和 `multipart/form-data` 类型的请求体,无法直接获取 `application/json` 请求中的数据;需通过 `php://input` 流读取原始 json 并手动解码。
当客户端(如 Postman、JavaScript 的 fetch 或 axios)以 Content-Type: application/json 发送 JSON 数据时,例如:
{"nombre": "fdsf"}PHP 不会 自动将其填充到 $_POST 数组中——因为 $_POST 仅在表单编码(如 x-www-form-urlencoded)或文件上传(multipart)时由 PHP 内核解析。JSON 属于「原始请求体」,此时 $_POST 为空,isset($_POST['nombre']) 必然为 false,导致逻辑跳转至错误分支。
✅ 正确做法:使用 php://input 读取原始请求体,并用 json_decode() 解析:
// 读取原始 JSON 数据(仅适用于 POST、PUT、PATCH 等有请求体的请求)
$json = file_get_contents('php://input');
// 检查是否成功读取
if ($json === false || empty($json)) {
http_response_code(400);
echo json_encode(['error' => 'Empty or invalid JSON body']);
exit;
}
// 解析 JSON(返回关联数组,便于后续访问)
$data = json_decode($json, true);
// 验证解析是否成功
if (json_last_error() !== JSON_ERROR_NONE) {
http_response_code(400);
echo json_encode(['error' => 'Invalid JSON format']);
exit;
}
// 安全访问字段(避免 Notice 错误)
if (isset($data['nombre']) && is_string($data['nombre'])) {
echo "Do thing";
} else {
echo "Error";
}⚠️ 注意事项:
立即学习“PHP免费学习笔记(深入)”;
- php://input 只能读取一次,且不支持 enctype="multipart/form-data" 的请求(此时应改用 $_FILES + $_POST 组合);
- 务必检查 json_decode() 的返回值及 json_last_error(),避免因格式错误导致 $data 为 null;
- 若需兼容多种 Content-Type(如同时支持表单和 JSON),可先判断 $_POST 是否非空,否则 fallback 到 php://input;
- 生产环境建议统一接口规范(推荐始终使用 JSON + application/json),并在入口处封装统一的请求解析逻辑。
掌握这一机制,是构建健壮 RESTful API 的基础一步。



















