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 】
相关推荐:
JavaScript如何实现路由_前端路由原理是什么
怎么用AI帮你设计一套个性化的手机App图标?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
JS弹性运动实现方法分析
如何在服务器上配置二级域名建站?
Claude怎样写约束型提示词_Claude约束提示词写法【教程】
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
如何在橙子建站上传落地页?操作指南详解
JavaScript如何实现错误处理_try...catch如何捕获异常?
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
使用spring连接及操作mongodb3.0实例
如何用已有域名快速搭建网站?
香港服务器部署网站为何提示未备案?
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
javascript日期怎么处理_如何格式化输出
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
如何在腾讯云服务器快速搭建个人网站?
Laravel如何与Inertia.js和Vue/React构建现代单页应用
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
JS碰撞运动实现方法详解
Laravel如何实现模型的全局作用域?(Global Scope示例)
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
Python制作简易注册登录系统
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
如何用wdcp快速搭建高效网站?
Linux网络带宽限制_tc配置实践解析【教程】
长沙做网站要多少钱,长沙国安网络怎么样?
JavaScript Ajax实现异步通信
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
如何在香港免费服务器上快速搭建网站?
在线教育网站制作平台,山西立德教育官网?
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
高防服务器:AI智能防御DDoS攻击与数据安全保障
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
如何快速查询域名建站关键信息?
JavaScript中的标签模板是什么_它如何扩展字符串功能
Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】
iOS中将个别页面强制横屏其他页面竖屏
如何用好域名打造高点击率的自主建站?
东莞市网站制作公司有哪些,东莞找工作用什么网站好?


('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;
}