JSONP的原理和優(yōu)缺點(diǎn)

JSONP的原理:
由于同源策略不會(huì)阻止動(dòng)態(tài)腳本的插入到文檔中去,所以催生出了一種很常用的跨域方式: JSONP(JSON with Padding)。

原理說起來也很簡(jiǎn)單:

假設(shè),我們?cè)错?yè)面是在a.com,想要獲取b.com的數(shù)據(jù),我們可以動(dòng)態(tài)插入來源于b.com 的腳本:

script=document.createElement("script");  
script.type="text/javascript";  
script.src="http://www.b.com/getdata?callback=demo";  
function demo(data) {  
  console.log(data.msg);  
}

這里,我們利用動(dòng)態(tài)腳本的src屬性,變相地發(fā)送了一個(gè)http://www.b.com/getdata?callback=demo的GET請(qǐng)求。這時(shí)候,b.com頁(yè)面接受到這個(gè)請(qǐng)求時(shí),利用JSONP,服務(wù)端會(huì)接受這個(gè)callback參數(shù),然后用這個(gè)參數(shù)值包裝要返回的數(shù)據(jù),像這樣:

demo({msg:"helloworld"});  

這時(shí)候,如果a.com的頁(yè)面上正好有一個(gè)demo 的函數(shù):

function demo(data) {  
  console.log(data.msg);  
} 

當(dāng)遠(yuǎn)程數(shù)據(jù)一返回的時(shí)候,隨著動(dòng)態(tài)腳本的執(zhí)行,這個(gè)demo函數(shù)就會(huì)被執(zhí)行。

到這里,你應(yīng)該能明白這個(gè)技術(shù)為什么叫JSONP了吧?就是因?yàn)槭褂眠@種技術(shù)服務(wù)器會(huì)接受回調(diào)函數(shù)名作為請(qǐng)求參數(shù),并將JSON數(shù)據(jù)填充進(jìn)回調(diào)函數(shù)中去。

----------JSONP的缺點(diǎn):

1.首先,它沒有關(guān)于JSONP調(diào)用的錯(cuò)誤處理,一旦回調(diào)函數(shù)調(diào)用失敗,瀏覽器會(huì)以靜默失敗的方式處理。

2.其次,它只支持GET請(qǐng)求,這是由于該技術(shù)本身的特性所決定的。因此,對(duì)于一些需要對(duì)安全性有要求的跨域請(qǐng)求,JSONP的使用需要謹(jǐn)慎一點(diǎn)了。

3.JSONP不支持用async:false的方法設(shè)置同步。

----------JSONP的優(yōu)點(diǎn):
由于JSONP對(duì)于老瀏覽器兼容性方面比較良好,因此,對(duì)于那些對(duì)IE8以下仍然需要支持的網(wǎng)站來說,仍然被廣泛應(yīng)用。不過,針對(duì)高級(jí)瀏覽器,建議還是用CORS 方法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容