今天主要写一下XML方式封装通信接口的代码实现,XML的通信接口编写起来明显要比json的复杂一些,不过道理很简单,无非就是拼接成一个xml字符串输出,接着昨天的代码继续写。
<?php
class Response{
/***********************************
* 返回json格式数据
* $param integer $code
* $param string $message
* $param array $data
* return json
*
******************************/
public static function json($code,$message='',$data=array()){
//做出一个验证,如果不是数字,就返回空
if(!is_numeric($code)){
return '';
}
//把穿进来的三个值,组装成一个数组
$result = array(
'code' => $code,
'message' => $message,
'data' => $data
);
//json_encode()把数组转化成json格式输出
echo json_encode($result);
exit;
}
/***********************************
* 返回xml格式数据
* $param integer $code
* $param string $message
* $param array $data
* return json
*
******************************/
public static function xml($code,$message='',$data=array()){
//做出一个验证,如果不是数字,就返回空
if(!is_numeric($code)){
return '';
}
//把穿进来的三个值,组装成一个数组
$result = array(
'code' => $code,
'message' => $message,
'data' => $data
);
//便于浏览器输出xml格式文件
header('content-type:text/xml');
//拼接xml
$xml.="<?xml version='1.0' encoding='UTF-8' ?>";
$xml.='<root>';
$xml.=self::xmlToEncode($result); //获取组装好的xml数据
$xml.='</root>';
echo $xml;
exit;
}
public static function xmlToEncode($arr){
//准备一个接收的空数组
$xml='';
//将这个数组的键,作为节点名称,值作为内容
foreach ($arr as $key => $value) {
/*约定一个规则,如果键是数字的话,格式为<item id='5'>aaa</item>*/
if(is_numeric($key)){
$attr = " id='{$key}'";//属性的值需要带上引号,不然报错
$key = 'item';
}
$xml.="<{$key}{$attr}>";
//如果$value的值是个多维数组的话,需要递归遍历
$xml.=is_array($value) ? self::xmlToEncode($value) : $value;
$xml.="</{$key}>";
}
return $xml;
}
}
$array=array(
'name'=>'学PHP的小蚂蚁',
'age'=>'27',
'sex'=>'male',
'url'=>'博客 http://my.oschina.net/woshixiaomayi/blog',
'like'=>array(
'eat'=>'apple',
'drink'=>'milk',
'happy',
'lucky'
)
);
Response::xml(200,'success',$array);
/*
打印出来的样子
<root>
<code>200</code>
<message>success</message>
<data>
<name>学PHP的小蚂蚁</name>
<age>27</age>
<sex>male</sex>
<url>博客 http://my.oschina.net/woshixiaomayi/blog</url>
<like>
<eat>apple</eat>
<drink>milk</drink>
<item id="0">happy</item>
<item id="1">lucky</item>
</like>
</data>
</root>
*/
?>
其中有两点需要注意:
在拼接xml字符串的时候,如果数据是一个多维的数组,这时候就需要递归遍历的方法来拼接字符串。
xml的节点名称不能为数字,所以采取了一个方法<item id='12'>的方法来代替,这个可以自定义的,根据自己需要定义。
来源:oschina
链接:https://my.oschina.net/u/1423209/blog/516871