JSONP是JSON with padding(填充式JSON或參數式JSON)的簡寫,是應用JSON的一種新方法,常用于伺服器與用戶端跨源通信,在後來的Web服務中非常流行。本文将詳細介紹JSONP
JSONP的基本思想是,網頁通過添加一個<script>元素,向伺服器請求JSON資料,這種做法不受同源政策限制;伺服器收到請求後,将資料放在一個指定名字的回調函數裡傳回來
當通過<script>元素調用資料時,響應内容必須用javascript函數名和圓括号包裹起來。而不是發送這樣一段JSON資料,這就是JSONP中P的意義所在
JSONP看起來與JSON差不多,隻不過是被包含在函數調用中的JSON,它會發送這樣一個包裹後的JSON響應:
包裹後的響應會成為<script>元素的内容,它先判斷JSON編碼後的資料,然後把它傳遞給handleResponse()函數
在實踐中,支援JSONP的服務不會強制指定用戶端必須實作的回調函數名稱,比如handleResponse。相反,它們使用査詢參數的值,允許用戶端指定一個函數名,然後使用函數名去填充響應。許多支援JSONP的服務都能分辨出這個參數名。另一個常見的參數名稱是callback,為了讓使用到的服務支援類似特殊的需求,就需要在代碼上做一些修改了
JSONP由兩部分組成:回調函數和資料。回調函數是當響應到來時應該在頁面中調用的函數。回調函數的名字一般是在請求中指定的。而資料就是傳入回調函數中的JSON資料
這個URL是在請求一個JSONP地理定位服務。通過査詢字元串來指定JSONP服務的回調參數是很常見的,就像上面的URL所示,這裡指定的回調函數的名字叫handleResponse()
JSONP是通過動态<script>元素來使用的,使用時可以為src屬性指定一個跨域URL。這裡的<script>元素與<img>元素類似,都有能力不受限制地從其他域加載資源。因為JSONP是有效的javascript代碼,是以在請求完成後,即在JSONP響應加載到頁面中以後,就會立即執行
JSONP之是以在開發人員中極為流行,主要原因是它非常簡單易用,老式浏覽器全部支援,伺服器改造非常小。與圖像Ping相比,它的優點在于能夠直接通路響應文本,支援在浏覽器與伺服器之間雙向通信
使用<script>元素進行Ajax傳輸,不受同源政策的影響,是以可以使用它們從其他的伺服器請求資料;而且,包含JSON編碼資料的響應體會自動解碼(即執行)
不過,JSONP也有兩點不足:首先,JSONP是從其他域中加載代碼執行。如果其他域不安全,很可能會在響應中夾帶一些惡意代碼,而此時除了完全放棄JSONP調用之外,沒有辦法追究。是以在使用不是自己運維的Web服務時,一定得保證它安全可靠;其次,要确定JSONP請求是否失敗并不容易。雖然HTML5給<script>元素新增了一個onerror事件處理程式,但目前還沒有得到任何浏覽器支援。為此,開發人員不得不使用計時器檢測指定時間内是否接收到了響應。但就算這樣也不能盡如人意,畢竟不是每個使用者上網的速度和帶寬都一樣
【前端】
【後端】
百度搜尋框就是使用了JSONP的技術,在百度搜尋的URL中,有用的查詢如下
結果為:
是以,wd為關鍵詞,cb用來JSONP的函數名。在擷取的資料中,s為以關鍵詞開始的資料組成的資料
百度搜尋的關鍵URL如下
wd為關鍵詞,當wd=a時,将打開關鍵詞為a的網頁