POST数据研究

林涛 2155℃ 0评论

刚和拓维的调试短代支付的问题,对方用Java做了一个Post把Xml文件发送到我方的PHP接口上。
其实很简单的一个接口却整了两天,反复思考之后感觉是在 沟通上。
对方一直说是用Java Post Xml 到接口,我理解成用键值对的方式做了一个POST(类同GET);问题就在这个理解上,其实就是单纯的POST,没有键值对,就是把整个XML文件发送到PHP接口上。
以下整理的关于PHP接受这类请求的方法,很管用。

说明: 这篇总结是关于$_POST,$HTTP_RAW_POST_DATA,file_get_contents(“php://input”)的区别
仅在于Content-Type: application/x-www-form-urlencoded 和 Content-Type: 无说明 的两种情况.
Content-Type: multipart/form-data; boundary=—————————随机串
不在讨论之列.

Content-Type: application/x-www-form-urlencoded 常在于表单form指定为enctype=”application/x-www-form-urlencoded”
Content-Type: multipart/form-data; boundary=—————————随机串 常见于 表单form指定为 enctype=”multipart/form-data”

测试环境: windows xp sp2 + apache2 + php4
时间: 2006 – 12 – 03
测试人: 泡面(youngerpeo@hotmail.com)
具体流程:

client 请求 server,请求内容包括http头,http体
http头和httpd以一个空行分隔

server开启一个php进程,解析,返回数据

server在开启php进程,此时php进程会有一些数据输入.

根据手册上的说法:

php://stdin,php://stdout 和 php://stderr 允许访问 PHP 进程相应的输入或者输出流。

php://output 允许向输出缓冲机制写入数据,和 print() 与 echo() 的方式相同。

php://input 允许读取 POST 的原始数据。和 $HTTP_RAW_POST_DATA 比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini 设置。php://input 不能用于 enctype=”multipart/form-data”。

php://stdin 和 php://input 是只读的,同时 php://stdout,php://stderr 和 php://output 是只写的。

也就是说php://input和$HTTP_RAW_POST_DATA是$_POST的原始数据, $_POST是php自动将原始数据进行解析成健值对的数组.

但是这里有两种情况需要特别说明.
1.post数据是通过正常的表单post过来,form 的enctype=”application/x-www-form-urlencoded”,
2.post数据是程序模拟提交的,例如socket

如果是第一种情况:
post数据特点: 键值对相当明显
http头中 Content-Type: application/x-www-form-urlencoded

file_get_contents(“php://input”); 可以得到原始的post数据;
$HTTP_RAW_POST_DATA 无法得到数据(重要)
$_POST数组里有明显的键值对存在.

如果是第二种情况:
post数据特点: 没有规则,可以是任意的数据规则.例如xml数据
http头 Content-Type根据post数据特点,可以自由设置,也可以设置为application/x-www-form-urlencoded
如果设置为application/x-www-form-urlencoded,则$HTTP_RAW_POST_DATA没有任何值.

file_get_contents(“php://input”); 可以得到原始的post数据(任何情况)
如果设置为application/x-www-form-urlencoded,则$HTTP_RAW_POST_DATA没有任何值.其他情况下,跟php://input一样.

如果设置为application/x-www-form-urlencoded,则$_POST仅仅根据&将数据隔开,然后再根据=来得到键值对.如果不存在&和=,则为空
如果设置为其他类型,则$_POST永远为空

综上所述,如果需要得到post数据的原型,最好使用php://input.

如需转载请注明: 转载自26点的博客

本文链接地址: POST数据研究

转载请注明:26点的博客 » POST数据研究

喜欢 (0)
发表我的评论
取消评论

表情