JSONP
Jsonp(JSON with Padding) 是 json 的一種"使用模式",可以讓網(wǎng)頁從別的域名(網(wǎng)站)那獲取資料,即跨域讀取數(shù)據(jù)。
為什么我們從不同的域(網(wǎng)站)訪問數(shù)據(jù)需要一個(gè)特殊的技術(shù)(JSONP )呢?這是因?yàn)橥床呗浴?br>
同源策略,它是由Netscape提出的一個(gè)著名的安全策略,現(xiàn)在所有支持JavaScript 的瀏覽器都會(huì)使用這個(gè)策略。
- 利用 html 的 <script> 元素的這個(gè)開放策略,網(wǎng)頁可以得到從其他來源動(dòng)態(tài)產(chǎn)生的 JSON 資料,而這種使用模式就是所謂的 JSONP。
1. 服務(wù)端JSONP格式數(shù)據(jù)
如客戶想訪問 : /try/ajax/jsonp.php?jsonp=callbackFunction。
假設(shè)客戶期望返回JSON數(shù)據(jù):["customername1","customername2"]。
真正返回到客戶端的數(shù)據(jù)顯示為:callbackFunction(["customername1","customername2"])。
服務(wù)端文件jsonp.php代碼為:
$callbackname = $_GET['jsoncallbackname']; //獲取回調(diào)函數(shù)名 callbackname =
$arr = array( // json數(shù)據(jù) $arr =
'name' => "srark",
"age" => 18,
"msg" => "現(xiàn)在我們學(xué)習(xí)jsonp原理"
);
echo $callbackname."(".json_encode($arr).")" //輸出jsonp格式的數(shù)據(jù) echo $callbackname."(".json_encode($arr). ")";
客戶端頁面代碼
jsonp("api/jsonpcallback.php?jsoncallback=info",'info',function(data){ //調(diào)用封裝函數(shù)
console.log(data.name +'----'+data.age);
})
function jsonp(url,callbackname,callback){ //封裝函數(shù)
var tagScript = document.createElement("script"); // 創(chuàng)建了一個(gè)script 標(biāo)簽
tagScript.src = url; // 給這個(gè)標(biāo)簽的src賦一個(gè)值
document.body.appendChild(tagScript); // 把這個(gè)標(biāo)簽追加到body里面
window[callbackname] = callback; // 給window賦一個(gè)全局的函數(shù)
document.body.removeChild(tagScript); // 用完就刪除這個(gè)script src標(biāo)簽
}
2 jquery中的ajax方法怎樣通過JSONP進(jìn)行遠(yuǎn)程調(diào)用
- type:請(qǐng)求方式 GET/POST
- url:請(qǐng)求地址
- async:布爾類型,默認(rèn)為true 表示請(qǐng)求是否為異步,如果為false表示為同步。
- dataType:返回的數(shù)據(jù)類型
- jsonp:傳遞給請(qǐng)求處理程序或頁面的,用以獲得jsonp回調(diào)函數(shù)名的參數(shù)名(一般默認(rèn)為:callback)
- jsonpCallback:自定義的jsonp回調(diào)函數(shù)名稱,默認(rèn)為jQuery自動(dòng)生成的隨機(jī)函數(shù)名,也可以寫"?",jQuery會(huì)自動(dòng)為你處理數(shù)據(jù)
- success:調(diào)用成功執(zhí)行的函數(shù)
- error:異常處理函數(shù)