我正在使用一个web服务,它正在向PHP页面提交HTTP POST,如下所示:
/POST参数形式:没有一个
标题:的content - type: text/xml
身体:<?xml version="1.0"?>
<mogreet>
<event>message-in</event>
<type>command_sms</type>
<campaign_id>12345</campaign_id>
<shortcode>123456</shortcode>
<msisdn>15552345678</msisdn>
<carrier><![CDATA[T-Mobile]]></carrier>
<carrier_id>2</carrier_id>
<message><![CDATA[xxxx testing]]></message>
</mogreet>
我需要能够将每个XML元素转换为PHP变量,以便我可以更新数据库。我以前从来没有处理过带有XML数据的传入POST,也不知道从哪里开始-我熟悉处理传入的GET/POST请求,但不熟悉原始XML。
我认为你需要使用$HTTP_RAW_POST_DATA
。在那之后,你可以像@ChristianGolihardt建议的那样使用SimpleXMLElement
。
注意,只有在php.ini中启用了always_populate_raw_post_data
设置,HTTP_RAW_POST_DATA
才可用。否则,这样做可能是最简单的:
$postData = file_get_contents("php://input");
...
$xml = new SimpleXMLElement($postData);
...
这将消除所有的SimpleXMLElement对象并返回您的数组:
从XML字符串:
<?php
$xml='<?xml version="1.0"?>
<mogreet>
<event>message-in</event>
<type>command_sms</type>
<campaign_id>12345</campaign_id>
<shortcode>123456</shortcode>
<msisdn>15552345678</msisdn>
<carrier><![CDATA[T-Mobile]]></carrier>
<carrier_id>2</carrier_id>
<message><![CDATA[xxxx testing]]></message>
</mogreet>';
$xml = simplexml_load_string($xml);
$xml_array = json_decode(json_encode((array) $xml), 1);
print_r($xml_array);
?>
从XML文件:
$xml = simplexml_load_file("mogreet.xml");
$xml_array = json_decode(json_encode((array) $xml), 1);
print_r($xml_array);
输出:Array
(
[event] => message-in
[type] => command_sms
[campaign_id] => 12345
[shortcode] => 123456
[msisdn] => 15552345678
[carrier] => Array
(
)
[carrier_id] => 2
[message] => Array
(
)
)
看看SimpleXMLElement
:
$xmlstr = $_POST['key'];
$xml = new SimpleXMLElement($xmlstr);
//work with $xml like this:
$event = $xml->mogreet->event;
你可以看到键如果你这样做:
print_r($_POST);
大多数时候,我们使用这种api,我们想要记录它,因为我们看不到它:
$debugFile = 'debug.log'
file_put_contents($debugFile, print_r($_POST, true), FILE_APPEND);
还可以看看Matt Browne的答案,关于获取原始输入。