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:

<?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).');');
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章