PHP返回json、xml格式数据,以及jsonp跨域

这里先展示下thinkphp框架的ajaxReturn函数源码:

/**
     * Ajax方式返回数据到客户端
     * @access protected
     * @param mixed $data 要返回的数据
     * @param String $type AJAX返回数据格式
     * @return void
     */
    protected function ajaxReturn($data,$type='') {
        if(empty($type)) $type  =   C('DEFAULT_AJAX_RETURN');
        switch (strtoupper($type)){
            case 'JSON' :
                // 返回JSON数据格式到客户端 包含状态信息
                header('Content-Type:application/json; charset=utf-8');
                exit(json_encode($data));
            case 'XML'  :
                // 返回xml格式数据
                header('Content-Type:text/xml; charset=utf-8');
                exit(xml_encode($data));
            case 'JSONP':
                // 返回JSON数据格式到客户端 包含状态信息
                header('Content-Type:application/json; charset=utf-8');
                $handler  =   isset($_GET[C('VAR_JSONP_HANDLER')]) ? $_GET[C('VAR_JSONP_HANDLER')] : C('DEFAULT_JSONP_HANDLER');
                exit($handler.'('.json_encode($data).');');  
            case 'EVAL' :
                // 返回可执行的js脚本
                header('Content-Type:text/html; charset=utf-8');
                exit($data);            
            default     :
                // 用于扩展其他返回格式数据
                Hook::listen('ajax_return',$data);
        }
    }

从上边的源码中可以看到,php返回各种格式的数据写法。

1、php返回json格式数据
php中返回json格式数据,用的是json_encode函数。
注意:从tp源码可以看到,每一种数据格式返回,都加了header,如果不加header直接输出json_encode的值的话,返回的是字符串不是对象,那么就需要js接收到值后用eval('('+data+')')转换为对象,这里不建议使用eval,建议使用JSON.parse(data);
另外,在php5.4之后的版本,json_encode还多了个参数,例如:JSON_UNESCAPED_UNICODE,就是不编码中文,输出后变成可读,此参数还有其他值,可以查看手册
eg:


echo json_encode("中文", JSON_UNESCAPED_UNICODE);
//"中文"

2、返回xml数据格式
返回xml格式就不多说了,和json类似。
3、jsonp跨域
在tp手册中,有这么一句话:

JSON和JSONP虽然只有一个字母的差别,但其实他们根本不是一回事儿:JSON是一种数据交换格式,而JSONP是一种非官方跨域数据交互协议。一个是描述信息的格式,一个是信息传递的约定方法。

这句话说的很准确,具体jsonp是啥,可以看看这边博客:【点我跳转→】说说JSON和JSONP 也许你会豁然开朗,很清楚了描述了什么是jsonp。
下边,是一个jsonp示例:
js部分:


<html>
<head>
	<meta charset="utf-8" />
	<script type="text/javascript" src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js">script>
	<title>jsonp跨域示例title>
head>
<script>
	//下边的请求相当于发送的是:http://***/test/jsonp.php?callback=getMessage
	$.ajax({
		url:"http://***/test/jsonp.php",//你请求的地址	 
		type:"get",
		cache:false,
		dataType:"jsonp",
		jsonp:"callback", //传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
		jsonpCallback:"getMessage", //自定义的jsonp回调函数名称
		success:function(data){
			console.log("success:"+data['b']);
		},
		error:function(){
			alert("发生异常");
		}
	});
	//下边这个函数可以注释调,也会走success,这是jQuery的功劳。jquery在处理jsonp类型的ajax时(虽然jquery也把jsonp归入了ajax,但他们根本不是一回事儿),自动生成回调函数并把数据取出来供success属性方法来调用。
	function getMessage(jsonp){
		console.log("message:"+jsonp);
	}
script>

php部分


header('Content-Type:application/json; charset=utf-8');
$handler = $_GET['callback'];//这里的callback与ajax中jsonp的值对应
$data = array('a'=>'aaa','b'=>'中文');//发送到前端的数据
exit($handler.'('.json_encode($data,JSON_UNESCAPED_UNICODE).');');

你可能感兴趣的:(PHP,---PHP功能)