解读PHP的输入流
1,php://input 是一个只读的文件流,允许用户从http请求中读取原始数据。
在使用POST请求时,最好使用php://input来代替。为什么? 一个简单的$HTTP_RAW_POST_DATA不是可以读取了么?
因为 php://input 不依赖于php.ini 配置。(是啊,php.ini 那么多配置项,每次都看着让人头痛,累觉不爱是吗?)
2,默认情况下PHP只支持Content-Type为:application/x-www.form-urlencoded 类型的数据。
使用 php://input 和 HTTP_RAW_POST_DATA 都可以处理Content-Type=text/xml 类型的数据。可以这样用
<?php $postdata = file_get_contents("php://input"); ?>
但 php://input不能处理enctype="multipart/form-data"类型的请求。
3,_POST数据可以看做是将HTTP_RAW_POST_DATA分离成若干键值对后的数据
$HTTP_RAW_POST_DATA 应该是这个样 key1=value1&key2=value2
那么$_POST这个数组则应该是这个样子:
$_POST = array(
"key1" => "value1",
"key2" => "value2",);。
注意:
一个用php://input打开的流只能读一次,由于SAPI的实现问题,这个流对象不支持seek操作。
这样,你只能打开另一个php://input并重新读取,当然,前提是请求数据已经保存下来。
通常,这事POST请求时的情况,其它如PUT或者PROPFIND的请求方式则不能这样操作。
4, 提交表单时,enctype 指的是form里的content-type。(也是http报文中的header)
application/x-www-form-urlencoded 是浏览器默认的content-type.
此外还有multipart/form-data。
如果还有其它内容类型,那么这种未定义的数据如何处理是未定义的。浏览器将会直接忽略这些封装类型并且不会报错。
比如,有一种内容类型是 application/octet-stream,那么浏览器就会把它当作一块结构未知的数据块发出去。
至于服务器怎么去处理这些数据。我们下次来好好探讨下。
、