JSONP是JSON with padding(填充式JSON或參數式JSON)的簡寫,是應用JSON的一種新方法,在後來的Web服務中很是流行。JSONP看起來與JSON差很少,只不過是被包含在函數調用中的JSON,就像下面這樣。json
callback({ 「name」: 「Nicholas」 });
JSONP由兩部分組成:回調函數和數據。回調函數是當響應到來時應該在頁面中調用的函數。回調函數的名字通常是在請求中指定的。而數據就是傳入回調函數中的JSON數據。下面是一個典型的JSONP請求。跨域
http://freegeoip.net/json/?callback=handleResponse
這個URL是在請求一個JSONP地理定位服務。經過查詢字符串來指定JSONP服務的回調參數是很常見的,就像上面的URL所示,這裏指定的回調函數的名字叫handleResponse() 。瀏覽器
JSONP是經過動態 <script> 元素來使用的,使用時能夠爲 src 屬性指定一個跨域URL。這裏的 <script> 元素與 <img> 元素相似,都有能力不受限制地從其餘域加載資源。由於JSONP是有效的JavaScript代碼,因此在請求完成後,即在JSONP響應加載到頁面中之後,就會當即執行。來看一個例子。安全
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);
這個例子經過查詢地理定位服務來顯示你的IP地址和位置信息。服務器
JSONP之因此在開發人員中極爲流行,主要緣由是它很是簡單易用。與圖像Ping相比,它的優勢在於可以直接訪問響應文本,支持在瀏覽器與服務器之間雙向通訊。不過,JSONP也有不足。運維
首先,JSONP是從其餘域中加載代碼執行。若是其餘域不安全,極可能會在響應中夾帶一些惡意代碼,而此時除了徹底放棄JSONP調用以外,沒有辦法追究。所以在使用不是你本身運維的Web服務時,必定得保證它安全可靠。函數