天天看點

JSONP原理及其使用

jsonp主要是為了解決跨域通路問題而産生的,其傳回的資料格式一般就是一個js腳本,這個腳本有以下特點:

  1. 傳回的js腳本通常是服務端動态生成的。
  2. 整個腳本通常有且僅有一條語句,且是一個函數調用。
  3. 腳本中調用到的函數,是頁面上存在的一個函數,其函數名通過get參數傳遞給服務端,服務端再将其回寫到js腳本中。
  4. 函數的參數,是服務端處理後的結果資料,以json格式直接寫在腳本中。這也是jsonp得名的由來。

因為,ajax是不允許跨域通路的,是以要從其他站點擷取資料時,就需要經過一些特殊的手段才行,jsonp就是一種成本比較低的手段(此外還有服務端代理等方式)。jsonp主要是利用了<script><img><iframe>标簽可以跨域通路的特點。具體的步驟如下:

  1. 首先,在本地頁面上事先準備好一個用于接受傳回資料的函數,比如:function showList(listdata){...};
  2. 其次,在需要的時點靜态或動态地建立一個标簽,比如:<script type="text/javascript" src="http://another.website/jsonp_call?arg1=xx&arg2=xx&callback=showList" ></script>,其中:
    1. another.website:是另外一個站點的域名或ip位址。
    2. jsonp_call:是該站點提供的一個動态内容通路的服務,可用php、java等任何技術實作。
    3. arg1、arg2:是該服務所需要的參數
    4. callback:是用于傳回結果的回調函數名。
  3. 然後,another.website站點接收到這個jsonp_call的請求後,進行相應的處理,并将放回的結果封裝為一個js腳本,其内容類似這樣的形式:showList([{id:1,name:'a'}, {id:2,name:'b'}, ..., {id:n,name:'NNN'}]);
  4. 最後,結果傳回到用戶端後,就會自動解析并執行這個showList函數。

這樣就完成了從“向其他站點發起請求”到“接收其他站點的應答資料”的整個過程,并且突破了ajax跨域通路的限制。

繼續閱讀