设置Content-Type: application/json后cURL请求返回空数组的问题
哈哈,这个问题我碰到过好多次了,本质是PHP对不同请求内容类型的解析逻辑差异搞的鬼,我给你拆解清楚:
为什么带
Content-Type: application/json会返回空数组? PHP默认不自动解析JSON请求体
PHP的$_POST超全局变量只对application/x-www-form-urlencoded(普通表单提交的默认类型)或multipart/form-data(带文件上传的表单类型)的请求体做自动解析。当你给请求加上Content-Type: application/json时,服务器不会把请求体解析到$_POST里——如果你的test.php代码是直接从$_POST拿数据,那自然拿到的就是空数组。后端代码没处理JSON请求体
你的test.php大概率没写专门处理JSON格式请求的逻辑。要获取JSON请求体里的数据,得手动读取PHP的原始输入流:// 读取原始请求体 $rawJson = file_get_contents('php://input'); // 转成关联数组(第二个参数true是关键) $requestData = json_decode($rawJson, true);如果没做这一步,当请求头标记为JSON类型时,代码找不到可用的数据,就只能返回空数组了。而当你去掉
Content-Type时,服务器会默认把请求体当作普通表单格式解析(前提是你的请求体本身是key=value这种表单结构),这时候$_POST就能拿到数据,所以返回正常。
关于你期望返回JSON格式数据的问题
这里要区分清楚:请求头的Content-Type是告诉服务器你发送的数据是什么格式,和服务器返回给你的数据格式完全是两回事。要让服务器返回JSON,你需要在test.php里主动设置响应头并输出JSON格式的内容:
// 设置响应头为JSON类型 header('Content-Type: application/json'); // 把数据转成JSON字符串输出 echo json_encode($yourDataArray);
这样不管你请求时用什么Content-Type,只要后端逻辑处理正确,都能拿到JSON格式的返回结果。
内容的提问来源于stack exchange,提问作者David C.
相关产品推荐
相关产品推荐

