最新消息:yaf表单扩展中新增加了浮点数、日期和集合的校验。php yaf框架扩展实践三——表单

php获取post请求的json参数

PHP 2599浏览 0评论

早年APP还不火的时候,php用来开发网站的表单提交,获取post参数都是用$_POST对象获取。后来开始用来开发app接口,和前端同事沟通用json格式数据传递,post请求传递的参数也是json格式,一开始不太明白,以为http请求头中的body是形如这样的格式:

json_param=一个json格式的字符串

就是把所有参数封到一起,然后编码成json格式,最后以kv的形式传递上来,但是后来发现不是,所谓的json数据格式是http请求中的body是一个json格式的字符串,这个用$_POST就获取不到了。下面结合http头信息来理了一下这些个方式http请求body中的不同和如何获取这类型的参数。

php做网页的表单提交

早年网页表单的提交,都是用$_POST获取请求参数,实际上在http请求头中是用kv值的形式存在,如:

网页表单提交http请求头

网页表单提交http请求头

php在接收到这种请求的时候,php底层系统会将这种字符串解析并存放进$_POST变量中,所以在php中就可以通过$_POST获取这些参数。注意看下,这里的Content-Type是:application/x-www-form-urlencoded

当然在上传文件的时候,表单需要增加一个 enctype=”multipart/form-data” 才可以。早年一直不明白为什么,后来才知道这时候http头格式发生了变化,如下图:

上传文件http请求头

上传文件http请求头

Content-Type变成了multipart/form-data格式,这种格式的数据获取在php底层也做了处理,普通的非文件参数一样可以通过$_POST获取,文件参数可以通过$_FILES获取。

那么开头说的json格式数据是咋一回事呢?下面分析一下。

php获取json格式数据

一开始也尝试用$_POST获取,结果没有取到,后来抓了包后才了解到:json格式的数据指的的http头body的字符串是一个json格式的字符串

下面截个http头就明白了。

http请求参数为json格式

http请求参数为json格式

这个在PHP中无法通过$_POST取到,php底层没有对这种方式进行处理。那么可以通过怎么样的方式去获取呢?在php中可以通过如下方式获取:

file_get_contents("php://input");

看到这个才恍然大悟,以前处理flash上传图片的时候也是通过这种方式获取body中的字节流的。获取到body内的数据后后续的处理就简单了,直接json_decode一下就可以了。

小结

踩完坑之后,又学到了不少新的东西,http请求头中其实还包含了不少格式,除了json,还有xml,html等等。

http各种请求头

http各种请求头

为什么用json这种方式来传递数据,不用传统的kv形式呢?其实用这种方式也有一个好处,就是可以很好的支持多维数组的传递,比如下单的时候,传递的商品参数中就会有多个,传统的kv形式不好处理,用json的方式就很好解决了。

转载请注明:快乐编程 » php获取post请求的json参数

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址