博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决 ThinkPHP5 无法接收 客户端 Post 传递的 Json 参数
阅读量:5827 次
发布时间:2019-06-18

本文共 895 字,大约阅读时间需要 2 分钟。

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 源码的时候发现他们也是用这个方法来获取的初始值]。

转载地址:http://qqodx.baihongyu.com/

你可能感兴趣的文章
tomcat一步步实现反向代理、负载均衡、内存复制
查看>>
运维工程师在干什么学些什么?【致菜鸟】
查看>>
Linux中iptables详解
查看>>
java中回调函数以及关于包装类的Demo
查看>>
maven异常:missing artifact jdk.tools:jar:1.6
查看>>
终端安全求生指南(五)-——日志管理
查看>>
Nginx 使用 openssl 的自签名证书
查看>>
创业维艰、守成不易
查看>>
PHP环境安装套件:快速安装LAMP环境
查看>>
CSS3
查看>>
ul下的li浮动,如何是ul有li的高度
查看>>
C++ primer plus
查看>>
python mysqlDB
查看>>
UVALive 3942 Remember the Word Tire+DP
查看>>
从微软的DBML文件中我们能学到什么(它告诉了我们什么是微软的重中之重)~目录...
查看>>
被需求搞的一塌糊涂,怎么办?
查看>>
c_数据结构_队的实现
查看>>
jquery 选择器总结
查看>>
Qt设置背景图片
查看>>
【阿里云文档】常用文档整理
查看>>