解决 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 参数的问题。
两个知识点:
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']代替。];- 可以通过
file_get_contents('php://input')代替上面的方法直接获取到传入的Json参数[我在阅读TP5源码的时候发现他们也是用这个方法来获取的初始值]。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)