JSONP是JSON with padding(填充式JSON或參數(shù)式JSON)的簡(jiǎn)寫(xiě),是應(yīng)用JSON的一種新方法,在后來(lái)的Web服務(wù)中非常流行。JSONP看起來(lái)與JSON差不多,只不過(guò)是被包含在函數(shù)調(diào)用中的JSON乌逐,就像下面這樣。
callback({ “name”: “Nicholas” });
JSONP由兩部分組成:回調(diào)函數(shù)和數(shù)據(jù)创葡≌闾撸回調(diào)函數(shù)是當(dāng)響應(yīng)到來(lái)時(shí)應(yīng)該在頁(yè)面中調(diào)用的函數(shù)〔涌剩回調(diào)函數(shù)的名字一般是在請(qǐng)求中指定的洛波。而數(shù)據(jù)就是傳入回調(diào)函數(shù)中的JSON數(shù)據(jù)。下面是一個(gè)典型的JSONP請(qǐng)求骚露。
http://freegeoip.net/json/?callback=handleResponse
這個(gè)URL是在請(qǐng)求一個(gè)JSONP地理定位服務(wù)蹬挤。通過(guò)查詢(xún)字符串來(lái)指定JSONP服務(wù)的回調(diào)參數(shù)是很常見(jiàn)的,就像上面的URL所示棘幸,這里指定的回調(diào)函數(shù)的名字叫handleResponse() 焰扳。
JSONP是通過(guò)動(dòng)態(tài) <script> 元素來(lái)使用的,使用時(shí)可以為 src 屬性指定一個(gè)跨域URL误续。這里的 <script> 元素與 <img> 元素類(lèi)似吨悍,都有能力不受限制地從其他域加載資源。因?yàn)镴SONP是有效的JavaScript代碼蹋嵌,所以在請(qǐng)求完成后育瓜,即在JSONP響應(yīng)加載到頁(yè)面中以后,就會(huì)立即執(zhí)行栽烂。來(lái)看一個(gè)例子爆雹。
function handleResponse(response){
alert(“You’re at IP address ” + response.ip + ”, which is in ” + response.city + ”, ” + response.region_name);
}
var script = document.createElement(“script”);
script.src = “http://freegeoip.net/json/?callback=handleResponse”;
document.body.insertBefore(script, document.body.firstChild);
這個(gè)例子通過(guò)查詢(xún)地理定位服務(wù)來(lái)顯示你的IP地址和位置信息。
JSONP之所以在開(kāi)發(fā)人員中極為流行愕鼓,主要原因是它非常簡(jiǎn)單易用钙态。與圖像Ping相比,它的優(yōu)點(diǎn)在于能夠直接訪(fǎng)問(wèn)響應(yīng)文本菇晃,支持在瀏覽器與服務(wù)器之間雙向通信册倒。不過(guò),JSONP也有不足磺送。
首先驻子,JSONP是從其他域中加載代碼執(zhí)行。如果其他域不安全估灿,很可能會(huì)在響應(yīng)中夾帶一些惡意代碼崇呵,而此時(shí)除了完全放棄JSONP調(diào)用之外,沒(méi)有辦法追究馅袁。因此在使用不是你自己運(yùn)維的Web服務(wù)時(shí)域慷,一定得保證它安全可靠。