PHP通过XML报文格式的POST请求方式,与第三方接口交互(发送xml,获取XML,并解析xml步骤)
开发者端:发送请求,并接收结果
<?php // 下面的demo,实现的功能如下: // 1-开发者需要判断一个用户是否存在,去请求第三方接口。 // 2-与第三方接口的通信,是以xml格式传送数据。开发者把用户信息以xml格式发送给第三方接口 // 3-第三方接口获取开发者的xml数据,通过数据的查询,把结果再以xml的格式发送给开发者。 //首先检测是否支持curl if (!extension_loaded("curl")) { trigger_error("对不起,请开启curl功能模块!", E_USER_ERROR); } //构造xml $xmldata="<?xml version='1.0' encoding='UTF-8'?><group><name>张三</name><age>22</age></group>"; //初始一个curl会话 $curl = curl_init(); //设置url curl_setopt($curl, CURLOPT_URL,"http://localhost/demo/dealxml.php"); //设置发送方式:post curl_setopt($curl, CURLOPT_POST, true); //设置发送数据 curl_setopt($curl, CURLOPT_POSTFIELDS, $xmldata); //TRUE 将curl_exec()获取的信息以字符串返回,而不是直接输出 curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); //执行cURL会话 ( 返回的数据为xml ) $return_xml = curl_exec($curl); //关闭cURL资源,并且释放系统资源 curl_close($curl); //echo $return_xml; //exit; //禁止引用外部xml实体 libxml_disable_entity_loader(true); //先把xml转换为simplexml对象,再把simplexml对象转换成 json,再将 json 转换成数组。 $value_array = json_decode(json_encode(simplexml_load_string($return_xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); echo "<pre>"; print_r($value_array); ?>
第三方接口端:接收请求,并返回处理结果
<?php //接收传送的数据 $fileContent = file_get_contents("php://input"); ### 把xml转换为数组 //禁止引用外部xml实体 libxml_disable_entity_loader(true); //先把xml转换为simplexml对象,再把simplexml对象转换成 json,再将 json 转换成数组。 $value_array = json_decode(json_encode(simplexml_load_string($fileContent, 'SimpleXMLElement', LIBXML_NOCDATA)), true); ### 获取值,进行业务处理 $name = $value_array['name']; $age = $value_array['age']; // 通过查询,判断该用户是否存在 ### 把查询结果添加到数组中 $value_array['result'] = 1; ### 把数组转换为xml格式,返回 $xml = "<?xml version='1.0' encoding='UTF-8'?><group>"; foreach ($value_array as $key=>$val) { if (is_numeric($val)){ $xml.="<".$key.">".$val."</".$key.">"; }else{ $xml.="<".$key."><![CDATA[".$val."]]></".$key.">"; } } $xml.="</group>";
// echo $xml;
return $xml; ?>
///////////////////////
postxml.php
-
<?php
//首先检测是否支持curl
if (!extension_loaded("curl")) {
trigger_error("对不起,请开启curl功能模块!", E_USER_ERROR);
}
//构造xml
$xmldata="<?xml version='1.0' encoding='UTF-8'?><group><name>张三</name><age>22</age></group>";
//初始一个curl会话
$curl = curl_init();
//设置url
curl_setopt($curl, CURLOPT_URL,"http://localhost/dealxml.php");
//设置发送方式:
postcurl_setopt($curl, CURLOPT_POST, true);
//设置发送数据
curl_setopt($curl, CURLOPT_POSTFIELDS, $xmldata);
//抓取URL并把它传递给浏览器
curl_exec($curl);
//关闭cURL资源,并且释放系统资源
curl_close($curl);
?>
END
dealxml.php
-
<?php
//接收传送的数据
$fileContent = file_get_contents("php://input");
//转换为simplexml对象
$xmlResult = simplexml_load_string($fileContent);
//foreach循环遍历
foreach($xmlResult->children() as $childItem) {
//输出xml节点名称和值
echo $childItem->getName() . "->".$childItem."<br />";
//其他操作省略
}
?>
-
//运行结果为:
name->张三age->22
-
演示代码下载地址:
百度网盘:http://pan.baidu.com/s/1o63F5qy
/////////////////
特地的写了一个程序测试下file_get_contents这个函数,汗,才发现原来它抓的是网页的源代码,不是网页的内容,以前一直以为抓的是内容。那么就可以说明一个问题了,它抓的是源代码,如果是HTML,那么echo之后就直接在浏览器里面输出了网页的容,但是由于现在抓的是XML的源代码,那么var_dump的话其实是不能输出XML的。因为浏览器不认识这个。那么怎么办呢?好办,先用file_get_contents远程抓取XML,再把抓取的结果用simplexml_load_string()处理就OK 啦。simplexml_load_string()读取的是XML,返回的是一个对象。那么下一个问题来了,如何获取对象里面的值呢?