php 5.6 发送 raw post 数据需传原始字符串并显式设 content-type:传数组会自动 urlencode 成表单格式,传 json_encode() 后的字符串则必须用 curlopt_httpheader 指定 application/json,否则服务端无法正确解析 php://input。

PHP 5.6 发送 Raw POST 数据,核心是绕过 cURL 对数组的自动编码行为,手动控制请求体和请求头。关键点在于:不能传数组给 CURLOPT_POSTFIELDS,必须传原始字符串,并显式设置 Content-Type。
直接发送原始字符串(如 JSON、XML、纯文本)
这是最常见也最稳妥的方式。适用于调用 REST API、Webhook 或接收方明确要求特定格式的场景。
- 先用
json_encode()、file_get_contents()或拼接生成你要发的原始字符串 - 把该字符串直接赋值给
CURLOPT_POSTFIELDS - 必须用
CURLOPT_HTTPHEADER显式声明Content-Type,例如application/json或text/xml - 不要同时传数组和设 header,cURL 会忽略你设的 header 并转为 multipart
避免踩坑:别让 cURL 自动转成表单格式
cURL 对 CURLOPT_POSTFIELDS 的处理逻辑很关键:
- 传 PHP 关联数组 → 自动 urlencode 成
application/x-www-form-urlencoded,后端进$_POST - 传字符串(哪怕内容是
json_encode()的结果)→ 当作 raw body 发,Content-Type默认仍是application/x-www-form-urlencoded,除非你手动覆盖 - 一旦没设正确的
Content-Type,对方服务端大概率解析失败,比如 PHP 接口收不到php://input,Node.js 拿不到req.body
接收方是 PHP 时要注意的兼容细节
如果你发的是 JSON 或 XML,而对方也是 PHP 5.6 环境,它需要正确读取 raw body:
- 推荐用
file_get_contents('php://input')—— 这是 PHP 5.6 官方推荐方式,稳定可靠 -
$HTTP_RAW_POST_DATA在 PHP 5.6 已废弃,启用需改php.ini中always_populate_raw_post_data = -1,但不建议依赖 - 若对方用
$_POST试图读 JSON,一定失败;必须用json_decode(file_get_contents('php://input'), true)
一个可直接运行的 JSON 示例
假设你要向 https://api.example.com/v1/data 提交结构化数据:
$data = ['user_id' => 123, 'action' => 'update', 'tags' => ['php', '5.6']];
$ch = curl_init('https://api.example.com/v1/data');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Accept: application/json'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close($ch);
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











