這裏先展示下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).');');