二、JSNONP
JSONP的原理是什么呢?我們來看看大神賀師俊的解釋:
很簡單,就是利用<script>標簽沒有跨域限制的“漏洞”(歷史遺跡啊)來達到與第三方通訊的目的。當需要通訊時,本站腳本創建一個<script>元素,地址指向第三方的API網址,并提供一個回調函數來接收數據(函數名可約定,或通過地址參數傳遞)。 第三方產生的響應為json數據的包裝(故稱之為jsonp,即json padding),這樣瀏覽器會調用callback函數,并傳遞解析后json對象作為參數。本站腳本可在callback函數里處理所傳入的數據。
找一篇大神寫的詳細易懂的文章
以下是菜鳥教程的案例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JSONP 實例</title>
</head>
<body>
<div id="divCustomers"></div>
<script type="text/javascript">
function callbackFunction(result, methodName)
{
var html = '<ul>';
for(var i = 0; i < result.length; i++)
{
html += '<li>' + result[i] + '</li>';
}
html += '</ul>';
document.getElementById('divCustomers').innerHTML = html;
}
</script>
<script type="text/javascript" src="http://www.runoob.com/try/ajax/jsonp.php?jsoncallback=callbackFunction"></script>
</body>
后端代碼
<?php
header('Content-type: application/json');
//獲取回調函數名
$jsoncallback = htmlspecialchars($_REQUEST ['jsoncallback']);
//json數據
$json_data = '["customername1","customername2"]';
//輸出jsonp格式的數據
echo $jsoncallback . "(" . $json_data . ")";
?>
JSONP總結:
JSONP是為了傳數據而存在的技術。網頁之間的通信原本有AJAX就夠了,而AJAX因為瀏覽器“同源策略”面對跨域情況就束手無策了。JSONP就這樣被發明了,利用<script>的src屬性不受“同源策略”的控制,“作弊”般地巧妙地逃過了瀏覽器的這一限制。
JSONP方法本質是創建<script>標簽,其src指向我們的數據地址。地址后面附帶一個回調函數(名字一般是callback或者是別的什么,就看后臺給我們的是什么了,函數名是我們起的)。然后,聲明這個回調函數。這樣,只要一引入上面的<script>標簽,就相當于執行了那個回調函數。
雖然jQuery把JSONP內置在了AJAX里,但是我們一定要清楚,AJAX和JSONP是完全不一樣的,一定不要混淆!