开发者社区> ryomahan> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

解决 ThinkPHP5 无法接收 客户端 Post 传递的 Json 参数

简介:
+关注继续查看

ThinkPHP5 版本: 5.0.16

这段时间在学习 API 开发,从网上搞了一个课程在跟着做,就在昨天我又一次碰到了讲师一路畅通我半天调试的情况,遇到的问题是我用 Postman 测试 API 某 Post 接口的时候无论怎么发送请求总是提示我参数验证失败,在我调试的过程中某次采用通过 Body 表传递参数的方法,API 神奇地通了,于是我判断是之前 Json 传递出了问题,就各种在网上搜,然而并没有解决方法[不过 Get 了两个知识点放在文章结尾处]。

关于 TP5 的问题度娘不行就只能查源代码了,于是乎我就跟着错误一点一点的打断点终于被我发现了问题所在:

源码

原来 TP5 是通过 strpos 函数在 Header 的 content-type 值中查找 app/json 字符串,也就是说你必须设置 Header 的 content-type 值为 app/json 才行,否则 TP5 不会认为你传入的是 Json 参数并给 Request::post 设值为空。

以上就解决了 TP5 无法接收 客户端 Post 传递的 Json 参数的问题。

两个知识点:

  1. content-type"application/json" 的数据 php 是不能直接识别的,所以导致 $_POST 数组为空。解决办法:我们只要用 $GLOBALS['HTTP_RAW_POST_DATA'] 把原始数据取出来,然后再 json_decode 就行了[使用此方法,需要设置 php.ini 中的always_populate_raw_post_data 值为 On][$HTTP_RAW_POST_DATA ,包含了 POST 的原始数据。但这不是一个超全局变量,要在函数中使用它,必须声明为 global ,或使用 $GLOBALS['HTTP_RAW_POST_DATA'] 代替。];
  2. 可以通过 file_get_contents('php://input') 代替上面的方法直接获取到传入的 Json 参数[我在阅读 TP5 源码的时候发现他们也是用这个方法来获取的初始值]。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
MVC框架模式技术实例(用到隐藏帧、json、仿Ajax、Dom4j、jstl、el等)(1)
MVC框架模式技术实例(用到隐藏帧、json、仿Ajax、Dom4j、jstl、el等)
28 0
STM32封装ESP8266一键配置函数:实现实现AP模式和STA模式切换、服务器与客户端创建
STM32封装ESP8266一键配置函数:实现实现AP模式和STA模式切换、服务器与客户端创建
148 0
jfinal为weebox弹出框传递参数
jfinal为weebox弹出框传递参数
32 0
jfinal为weebox弹出框传递参数
jfinal为weebox弹出框传递参数
36 0
ThinkPHP 5使用OSS
ThinkPHP 5使用OSS示例。
4936 0
使用 CSS 追踪用户
原文地址:Crooked Style Sheets 作者:jbtronics 除了使用 JS 追踪用户,现在有人提出了还可以使用 CSS 进行网页追踪和分析,译者认为,这种方式更为 优雅,更为 简洁,且 不好屏蔽,值...
732 0
[Erlang 0121] 当我们谈论Erlang Maps时,我们谈论什么 Part 3
Erlang/OTP 17.0 has been released  http://www.erlang.org/download/otp_src_17.0.readme     Erlang/OTP 17.
1372 0
MVC框架模式技术实例(用到隐藏帧、json、仿Ajax、Dom4j、jstl、el等)
前言: 刚刚学完了MVC,根据自己的感悟和理解写了一个小项目。 完全按照MVC模式,后面有一个MVC的理解示意图。 用MVC模式重新完成了联系人的管理系统: 用户需求: 多用户系统,提供用户注册、登录功能,对于没有登录的用户,不允许使用任何功能。
997 0
无法解析的外部符号 EVP_EncryptFinal_ex
无法解析的外部符号 EVP_EncryptFinal_ex 原因是缺少对应版本的Lib; Win32下编译是没有问题的,但平台配置为x64的就不行了。 需要引用 对应的64位的Lib.
661 0
Spring MVC无法获取到页面表单put过来的参数的解决方案
<p><span style="font-size:18px">问题:</span></p> <p><span style="font-size:18px"><span style="white-space:pre"></span>在使用Spring MVC开发resetful风格的Web应用时,发现Sping接收不到页面Form表单传到后台的值。</span></p> <p><spa
1741 0
+关注
ryomahan
以此为趣,乐在其中。
7
文章
3
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载