PHP怎么接收前端传的JSON数据_处理applicationjson格式数据方法【详解】
发布时间 - 2026-01-03 00:00:00 点击率:次PHP需手动读取php://input并json_decode(true)解析JSON请求体,校验Content-Type,注意php://input仅可读一次且不与multipart/form-data共存。
PHP 默认不会自动解析 application/json 请求体,必须手动读取并解码,否则 $_POST 为空、$_REQUEST 也拿不到数据。
如何正确读取原始 JSON 请求体
前端以 Content-Type: application/json 发送数据(比如 fetch() 或 axios.post()),PHP 不会像处理表单那样自动填充超全局变量。必须用 php://input 流读取原始请求体:
$json = file_get_contents('php://input'); $data = json_decode($json, true); if (json_last_error() !== JSON_ERROR_NONE) { http_response_code(400); echo json_encode(['error' => 'Invalid JSON']); exit; }
注意:php://input 只能读一次,且不能和 enctype="multipart/form-data" 共存;如果已调用过 file_get_contents('php://input'),后续再读会返回空字符串。
json_decode() 的关键参数与常见坑
第二个参数设为 true 才返回关联数组(否则是对象),这对后续用 $data['key'] 访问至关重要:
-
json_decode($json)→ 返回stdClass对象,需用->key -
json_decode($json, true)→ 返回数组,支持['key']和isset($data['key']) - 若 JSON 含中文或特殊字符,确保传入的字符串是 UTF-8 编码,否则
json_decode()返回null - PHP 7.3+ 支持
JSON_THROW_ON_ERROR,可改用异常方式捕错:json_decode($json, true, 512, JSON_THROW_ON_ERROR)
验证请求头是否真的是 application/json
不能只依赖前端声明,服务端应主动校验,避免被绕过或误处理:
$contentType = $_SERVER['CONTENT_TYPE'] ?? '';
if (strpos($contentType, 'application/json') !== 0) {
http_response_code(415);
echo json_encode(['error' => 'Content-Type must be application/json']);
exit;
}
注意:$_SERVER['CONTENT_TYPE'] 在 Apache 下可用,Nginx 需确保配置中透传了该头(如 fastcgi_pass_request_headers on;),否则可能为空。
与 POST 表单共存时的兼容性处理
有些接口既要支持 JSON,也要兼容传统 application/x-www-form-urlencoded,可以统一入口判断:
$input = file_get_contents('php://input');
if (!empty($input) && strpos($_SERVER['CONTENT_TYPE'] ?? '', 'application/json') === 0) {
$data = json_decode($input, true) ?: [];
} else {
$data = $_POST; // 包含表单字段
}
这种写法简单直接,但要注意:一旦用了 php://input,就不能再依赖 $_POST 解析 JSON;反过来,如果已触发过表单解析(如通过 parse_str() 或访问过 $_POST),php://input 就不可再读 —— 这个顺序和互斥关系最容易被忽略。
# php
# js
# 前端
# json
# apache
# nginx
# 编码
# app
# axios
# ios
# NULL
# 关联数组
# 全局变量
# 字符串
# 接口
# 对象
# input
# 表单
# 为空
# 的是
# 再读
# 也要
# 就不
# 则是
# 设为
# 用了
# 第二个
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
昵图网官方站入口 昵图网素材图库官网入口
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
Android 常见的图片加载框架详细介绍
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
Laravel怎么生成URL_Laravel路由命名与URL生成函数详解
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
WordPress 子目录安装中正确处理脚本路径的完整指南
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
网站建设整体流程解析,建站其实很容易!
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
如何在阿里云部署织梦网站?
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
Laravel如何记录自定义日志?(Log频道配置)
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
微信小程序 HTTPS报错整理常见问题及解决方案
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
Windows Hello人脸识别突然无法使用
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
网站页面设计需要考虑到这些问题
Android自定义控件实现温度旋转按钮效果
如何快速搭建支持数据库操作的智能建站平台?
php结合redis实现高并发下的抢购、秒杀功能的实例
lovemo网页版地址 lovemo官网手机登录
企业网站制作这些问题要关注
Laravel如何配置和使用缓存?(Redis代码示例)
利用python获取某年中每个月的第一天和最后一天
高防服务器租用首荐平台,企业级优惠套餐快速部署
如何制作一个表白网站视频,关于勇敢表白的小标题?
C++时间戳转换成日期时间的步骤和示例代码
,交易猫的商品怎么发布到网站上去?
如何用JavaScript实现文本编辑器_光标和选区怎么处理
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
如何在IIS中新建站点并解决端口绑定冲突?
Swift中swift中的switch 语句
JavaScript如何实现类型判断_typeof和instanceof有什么区别
Python高阶函数应用_函数作为参数说明【指导】
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
Laravel如何使用withoutEvents方法临时禁用模型事件
如何实现建站之星域名转发设置?
如何用腾讯建站主机快速创建免费网站?
如何快速登录WAP自助建站平台?
python中快速进行多个字符替换的方法小结
Android okhttputils现在进度显示实例代码


('php://input');
$data = json_decode($json, true);
if (json_last_error() !== JSON_ERROR_NONE) {
http_response_code(400);
echo json_encode(['error' => 'Invalid JSON']);
exit;
}