Ajax拉取第三方JSON后POST到PHP无法被json_decode解析怎么解决
跨端传递JSON数据到PHP的问题修复方案
问题根因
- 第一个请求的
dataType:'json'会让jQuery自动把第三方返回的JSON字符串解析为JS对象,你第二个AJAX直接把这个对象传给data参数时,jQuery默认会按application/x-www-form-urlencoded格式把对象转为键值对字符串,不是RAW JSON格式 - 你在PHP中用
php://input读取的是表单格式的字符串,自然无法通过json_decode解析
修复方案(二选一即可)
方案1:前端发送RAW JSON格式,适配现有PHP接收逻辑
修改前端第二个AJAX请求的配置,指定内容类型为JSON,同时把JS对象转为JSON字符串发送:
<script> $("#diary").click(function(){ $.ajax({ type:'get', // 注意你原代码的url漏了闭合引号,这里补上 url:'https://example.com', data:{ }, dataType:'json', success:function(result){ console.log(result); $.ajax({ type: "POST", url: "dd.php", // 把JS对象转为JSON字符串 data: JSON.stringify(result), // 指定发送的内容类型为JSON contentType: 'application/json', // 如果你的PHP返回的不是JSON格式,建议删除该行配置,避免jQuery解析报错 // dataType: "json", success: function (msg) { console.log(msg); } }); } }); }); </script>
现有PHP代码不需要修改,即可正常读取解析JSON内容。
方案2:不修改前端发送逻辑,调整PHP接收逻辑
如果不想调整前端代码,jQuery默认发送的表单格式数据可以直接通过$_POST全局变量读取,不需要读取php://input:
<?php // 直接读取POST表单格式的参数,不需要json_decode print_r($_POST); // 如果需要把整份数据转成JSON存入数据库,直接调用json_encode($_POST)即可 ?>
验证方法
打开浏览器开发者工具的「网络」面板,找到提交到dd.php的请求,查看「请求载荷」确认发送的内容格式,同时查看「响应」内容确认PHP返回的结果是否符合预期。
内容的提问来源于stack exchange,提问作者Nidhi
相关产品推荐
相关产品推荐

