这里先展示下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:
<?php
echo json_encode("中文", JSON_UNESCAPED_UNICODE);
//"中文"
2、返回xml数据格式
返回xml格式就不多说了,和json类似。
3、jsonp跨域
在tp手册中,有这么一句话:
JSON和JSONP虽然只有一个字母的差别,但其实他们根本不是一回事儿:JSON是一种数据交换格式,而JSONP是一种非官方跨域数据交互协议。一个是描述信息的格式,一个是信息传递的约定方法。
这句话说的很准确,具体jsonp是啥,可以看看这边博客:【点我跳转→】说说JSON和JSONP 也许你会豁然开朗,很清楚了描述了什么是jsonp。
下边,是一个jsonp示例:
js部分:
<!DOCTYPE html>
<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部分
<?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).');');