php 8.0 提交 json 数据失败主因是请求构造错误:必须显式设置 content-type 头、postfields 传 json 字符串而非数组、启用 curlopt_post、后端读 php://input 而非 $_post。

PHP 8.0 提交 JSON 数据,核心不是版本差异,而是请求构造逻辑是否正确。PHP 8.0 对 json_encode()、cURL 和流处理的支持更稳定,但常见失败仍源于头信息缺失、数据类型误设或自动编码干扰——和旧版一样,错一点,后端就收不到或返回 415 错误。
必须显式设置 Content-Type 头
PHP 不会自动根据数据内容推断类型。哪怕你传的是标准 JSON 字符串,若没手动声明头,cURL 默认发 application/x-www-form-urlencoded,后端就当表单处理,$_POST 可能为空,php://input 也可能解析失败。
- 用 cURL 时:加这一行 →
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json; charset=utf-8']); - 用
file_get_contents()+stream_context_create()时:'header' => "Content-Type: application/json\r\n"(注意是\r\n,不是\n) - 别用
header()函数——那是给响应设的,不是发请求用的
POSTFIELDS 必须传字符串,不能传数组
很多人写 curl_setopt($ch, CURLOPT_POSTFIELDS, $data_array),结果数据被自动转成 key=val&key2=val2 格式,JSON 结构全毁。PHP 8.0 依然如此。
- 先
$json_str = json_encode($data_array, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);(推荐加JSON_THROW_ON_ERROR捕获编码异常) - 再
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_str);—— 传的是字符串,不是数组 - 顺带检查
json_last_error()或捕获JsonException,避免空串或乱码提交
显式开启 POST 模式,别依赖 POSTFIELDS 自动触发
只设 CURLOPT_POSTFIELDS 不设 CURLOPT_POST,某些 PHP+cURL 组合下可能退化为 GET 请求,尤其在重定向或复用句柄时。
- 务必加:
curl_setopt($ch, CURLOPT_POST, true); - 同时建议加
CURLOPT_RETURNTRANSFER => true,避免直接输出响应 - 可选但推荐:
CURLOPT_FOLLOWLOCATION => false,防止 302 后丢失 JSON 头
后端接收要读 php://input,不是 $_POST
这是最容易混淆的一点:你发的是 application/json,PHP 就不会填充 $_POST。后端脚本必须主动读原始输入流。
- 正确写法:
$raw = file_get_contents('php://input');→$data = json_decode($raw, true); - 如果
$data === null,用json_last_error_msg()查原因(比如前端多传了逗号、用了中文引号) -
$_POST在这种场景下永远为空,不是 bug,是设计如此
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











