博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP的"php://input"和$HTTP_RAW_POST_DATA 和$_POST的关系
阅读量:7134 次
发布时间:2019-06-28

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

hot3.png

理论知识

 

​php://input 

php://input 数据输入流存放着 post 请求发送过来的原生数据,但 Content-Type:multipart/form-data(上传文件或图片的表单)的数据则不会载入其中,其他类型:

application/x-www-form-urlencode    foo1=bar1&foo2=bar2 普通的表单数据

application/json   {"foo1":"bar1", "foo2":"bar2",}

application/xml   <xml version="1.0"><data><foo1>bar1</foo1><foo2>bar2</foo2></data>

都会被载入其中

 

$HTTP_RAW_POST_DATA

$HTTP_RAW_POST_DATA 中的内容与 php://input 并无区别,同样无法识别 

Content-Type:multipart/form-data 的请求数据,且默认情况下它与 $_POST 互斥,即若请求数据格式可以填充至 $_POST 中去,即便它也能识别,也不会填充数据,比如 application/x-www-form-urlencode 类型的请求数据, php://input $_POST 和 它都能识别,但 $_POST 填充后默认配置下它是不会被填充的,除非修改 php.ini 文件将  always_populate_raw_post_data 配置参数使能,即只要能识别,就填充,不管 $_POST 是否被填充

 

$_POST

php 能自动识别处理填充到 $_POST 数组中的只有:

application/x-www-form-urlencode    不含有文件的表单

multipart/form-data   含有文件的表单(此时 php://input 和 $HTTP_RAW_POST_DATA 是无法识别数据流的)

两种php的标准数据类型

182704_evzt_252076.png

 

 

客户端的GET/POST的本质区别

 

GET 不包含数据流

GET请求并不像POST请求会有 form body 数据,GET请求的所有信息都包含在了请求的header中 query string 中,通过url进行传递,说白了它所代表的是一个标识而不含有数据流,所以PHP并不会把 GET 请求装入数据流中,而只是简单的将其解析填充到$_GET数组当中

170904_yfWL_252076.png

请求头:

GET url HTTP/1.1

Accept:期待服务器返回什么格式的数据 text/html application/json application/xml image/jpeg video/mp4 等等

 

 

POST 含有数据流

POST请求包括header和from body,header头指明请求的url,form body 中存放数据提交给服务端,PHP 会根据提交的数据类型动态的将数据流转化为相应的模式,比如一下两种PHP能识别处理POST请求的数据类型

?

=====================================================================

170936_Of0b_252076.png

=====================================================================

其实你会发现普通的表单提交 from data 所携带的数据编码同 get 请求中的 query string 完全一样,但这也是他们的本质区别, get 并不携带数据流 ,它完全整合到 header 流中去,php 将其填充到 $_GET 数组中 , $_POST 数组中则是能被 PHP 识别并处理的 请求中的 from body (呃,就是 from data)中的数据

=====================================================================

170944_CK1m_252076.png

=====================================================================

 

服务器端对POST请求的处理

PHP能识别并处理的POST请求的数据类型只有

application/x-www-form-urlencode

multipart/form-data

注意是识别并处理,将 POST 过来的数据识别处理填充到全局 $_POST 数组中去,其他类型的数据则无法填充 $_POST 数组

但在工作中我们不可能一直用表单请求服务器,APP开发时请求服务端往往发送的是 applicantion/json 或 applicant/xml 类型的参数数据,这时 PHP 无法识别处理此类数据流,但 PHP 会将此数据流存放在 php://input 数据流中

 

 

php://input 数据流

php://input 数据流存放的内容和 $HTTP_RAW_POST_DATA 的内容完全一样 但牵扯到性能方面的问题我们这里不推荐使用 $HTTP_RAW_POST_DATA  你可以认为 php://input 是一个资源

?

这样就获取到了此数据流中的内容

 

 

实例

   服务器端

?

  application/x-www-form-urlencoded post请求

?

   application/json post请求

?

   application/xml post请求

?

由于模拟mutipart/form-data的表单提交比较复杂我们这里就不做模拟了

总结:

1、php 能识别处理的标准数据类型为:application/x-www-form-urlencoded(普通的表单) 和 mutipart/form-data(encrypt="mutipart/form-data" 的表单),其他的比如 application/json application/xml 是没有办法处理好填充到 $_POST 中去的,但它们会被填充到 php://input 流中(所谓处理是 php 自动解析好给你 拿来就用的意思 注意我文章中多次提到识别和处理 )

2、php://input 能识别处理 mutipart/form-data 外的所有类型的数据,将其填充到自己的数据流, 我们可以通过它获取数据手动解析

=====================================================================

这些为数据流资源符

?

 

CLI下

转载于:https://my.oschina.net/sharesuiyue/blog/1592830

你可能感兴趣的文章
利用Java编码实现对oracle数据库的操作
查看>>
java字符串分割处理split及特殊符号
查看>>
远程连接mysql慢
查看>>
我的友情链接
查看>>
Linux学习进阶路线图
查看>>
Java多线程编程之限制优先级
查看>>
linux系统中如何进入退出vim编辑器使用方法
查看>>
8. 比权量力-chmod,chown,umask,lsattr,chattr命令
查看>>
Jenkins RCE CVE-2019-1003000 漏洞复现
查看>>
NumberFormat和DecimalFormat
查看>>
PreferenceActivity
查看>>
Linux系统之系统简介
查看>>
快速排序(JAVA)
查看>>
Apex 自定义异常
查看>>
mysql视图
查看>>
table 水平居中
查看>>
for 循环用法
查看>>
ttserver操作
查看>>
extrabackup
查看>>
静态编译ffmpeg
查看>>