thinkphp 接受post请求的xml数据

浏览:3432 最后更新:2017-01-22 17:07 分类:函数 关键字: post获取 XML解析 post,xml格式
记录一点日志吧,方便以后忘记。
在不同语言写接口是一件很繁琐的事,他的说的你不懂,你说的他不懂,我不知道php的数据流,就写过上传图片走的数据流,然后传递数据,流的方式还真的不会,或许是简化了吧。
如标题,我记录下java调用php接口,以xml格式传递,xml格式返回的形式吧。

首先传递方式都会是post,那么php接受post一般会有三种形式:
第一种:$_POST或为I('post.')
这种方式是比较熟悉的,很常用,也就是表单POST过来的数据。但注意,接口不一定就是表单提交,如果GET形式,可能会用的到。说的深沉一点:只能接收Content-Type: application/x-www-form-urlencoded提交的数据
第二种:file_get_contents("php://input");
这种方式,我就用的很少,只是了解一点,说是对于未指定 Content-Type 的POST数据,则可以使用file_get_contents(“php://input”);来获取原始数据。
事实上,用PHP接收POST的任何数据都可以使用本方法。而不用考虑Content-Type,包括二进制文件流也可以。
通俗点,这种方式就是第一种方式的加强版,任何未定义的POST都可以提交,是一种保险形式。
第三种:$GLOBALS['HTTP_RAW_POST_DATA'];
啊哈,我得到的数据也就是用这种啦,先看说明
说明:
总是产生 $HTTP_RAW_POST_DATA 变量包含有原始的 POST 数据。
此变量仅在碰到未识别 MIME 类型的数据时产生。
$HTTP_RAW_POST_DATA 对于 enctype="multipart/form-data" 表单数据不可用
如果post过来的数据不是PHP能够识别的,可以用 $GLOBALS['HTTP_RAW_POST_DATA']来接收,
比如 text/xml 或者 soap 等等
解释:
$GLOBALS['HTTP_RAW_POST_DATA']存放的是POST过来的原始数据。
$_POST或$_REQUEST存放的是 PHP以key=>value的形式格式化以后的数据。
但$GLOBALS['HTTP_RAW_POST_DATA']中是否保存POST过来的数据取决于centent-Type的设置,即POST数据时 必须显式示指明Content-Type: application/x-www-form-urlencoded,POST的数据才会存放到 $GLOBALS['HTTP_RAW_POST_DATA']中
这方式也就将你需要的所有原始数据保存在$GLOBALS['HTTP_RAW_POST_DATA'],然后你得到的就是整个xml。后面的就是将xml转为数组,然后进行操作。

粘贴部分代码
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (isset($postStr)) {
$xml = simplexml_load_string($postStr);
//返回结果解析(转换json格式)
$json = get_object_vars($xml);
$arr = $this->xml_to_array($postStr); //自定义的函数
$key = array_keys($arr);

//自定义函数
// xml转数组, 包括根键,忽略空元素和属性,尚有重大错误
public function xml_to_array( $xml )
{
$reg = "/<(\\w+)[^>]*?>([\\x00-\\xFF]*?)<\\/\\1>/";
if(preg_match_all($reg, $xml, $matches))
{
$count = count($matches[0]);
$arr = array();
for($i = 0; $i < $count; $i++)
{
$key = $matches[1][$i];
$val = $this->xml_to_array( $matches[2][$i] ); // 递归
if(array_key_exists($key, $arr))
{
if(is_array($arr[$key]))
{
if(!array_key_exists(0,$arr[$key]))
{
$arr[$key] = array($arr[$key]);
}
}else{
$arr[$key] = array($arr[$key]);
}
$arr[$key][] = $val;
}else{
$arr[$key] = $val;
}
}
return $arr;
}else{
return $xml;
}
}

可伶返回,我使用return不了,居然是自己定义一个xml,然后echo。不太理解,总之还是返回回去了。
评论( 相关
后面还有条评论,点击查看>>