我有一个PHP页面需要读取发布到此页面的XML。 帖子将由content-type:application / xml(不是application / x-www-form-urlencoded)完成。
例如,我的页面名为test.php,另一台服务器将XML发布到此页面(test.php)。 我的问题是如何创建一个代码到这个test.php页面来读取发布到它的xml?
更新
首先,非常感谢答案和花时间来帮助我。 我会尝试更好地解释我的问题。 我正在创建一个Messenger Robot。 我正在使用名为“botplataform”的平台。 更多信息请访问:http://code.google.com/p/botplatform/wiki/RobotServiceHostedOnWebServer
Basicaly这个plataform的工作原理如下: 我在我的instante messager(在本例中为MSN)上键入了一条消息,我键入的消息通过XML POST发送到我的PHP页面。 关于这种平台如何做到这一点的信息是这样的:
“帖子请求内容类型是 应用/ XML(未 应用程序/ x-WWW窗体-urlencoded)。所以 你应该读整个身体 xml数据,你无法读取任何数据 参数“。
我的PHP文件需要“读取”此XML以了解用户在MSN上输入的内容。他们将我的回答发回给将信息发送给用户的botplataform。
我可以发送botplataform的答案,但是我无法读取botplataform发送到我的php文件的XML。
如果您想测试,只需将广告主机(at)xquad(点)com(点)br与您的MSN进行对话即可。 它只会是“Em manutencao” 但是它有效,php创建了一个XML并回应它。
非常感谢,Flávio
答案 0 :(得分:4)
您可以使用$HTTP_RAW_POST_DATA
(manual entry)或php://input
信息流。
来自the manual:
php://input
可让您阅读原始POST
数据。它是$HTTP_RAW_POST_DATA
的内存密集型替代品,不需要任何特殊的php.ini指令。php://input
无法使用enctype="multipart/form-data"
。
更新:也许一些例子可能会有所帮助。
这是一个我称之为input.php
的简单脚本:
<?php
echo file_get_contents('php://input');
?>
使用cURL形成命令行:
curl -d "<xml><stuff>test</stuff></xml>" http://localhost/input.php
甚至设置内容类型:
curl -H "Content-Type: application/xml"
-d ...
输出是(正如预期的那样):<xml><stuff>test</stuff></xml>
但是,如果您尝试上传文件,通常会将 enctype
设置为multipart/form-data
(注意,不是{ {1}})你什么也得不到。
示例文件(content-type
):
test.xml
使用cURL上传文件:
<xml>
<stuff>test</stuff>
</xml>
curl -F "name=@test.xml" http://localhost/input.php
两者都不会从curl -F "name=@test.xml;type=application/xml" http://localhost/input.php
输出任何内容。但是,如果您修改脚本以查看input.php
数组(或者您将正常上传到PHP),那么您将获得内容。
我会调用新脚本$_FILES
:
form.php
使用curl上传文件:
<?php
echo file_get_contents($_FILES['name']['tmp_name']);
?>
将输出curl -F "name=@test.xml;type=application/xml" http://localhost/form.php
。
在这两种方法之间,您应该能够处理来自其他服务器的test.xml
文件或数据。
第二次更新:以这种方式强制POST
会阻止application/xml
停止工作,但之后又会回到$_FILES
工作:
php://input