PHP - 将传入的HTTP POST转换为变量

时间:2014-08-04 03:55:26

标签: php xml post

我正在使用一个将HTTP POST提交到PHP页面的Web服务,如下所示:

FORM / POST参数: 无

标头: 内容类型:text / xml

BODY:

<?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,也不知道在哪里starT - 我熟悉处理传入的GET / POST请求但不熟悉原始xml。

3 个答案:

答案 0 :(得分:1)

我认为您需要使用$HTTP_RAW_POST_DATA。之后,您可以使用SimpleXMLElement作为@ChristianGolihardt建议。

请注意HTTP_RAW_POST_DATA仅在php.ini中启用always_populate_raw_post_data设置时可用。否则,最简单的方法是这样做:

$postData = file_get_contents("php://input");
...
$xml = new SimpleXMLElement($postData);
...

答案 1 :(得分:0)

看看SimpleXMLElement

http://php.net/manual/de/class.simplexmlelement.php

$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的答案,获取原始输入。

答案 2 :(得分:0)

这将消除所有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
        (
        )

)