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


PHP - Convert incoming HTTP POST into variables

我正在使用一个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:

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