手寫一個jsonp實現

weixin_34007291發表於2017-10-19

JSONP是JSON with padding(填充式JSON或引數式JSON)的簡寫,是應用JSON的一種新方法,在後來的Web服務中非常流行。JSONP看起來與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服務時,一定得保證它安全可靠。

相關文章