摘要:慣例上瀏覽器提供回調函數的名稱當作送至服務器的請求中命名查詢參數的一部分,例如服務器會在傳給瀏覽器前將數據填充到回調函數中。
1 什么是Jsonp?
JSONP(JSON with Padding)是數據格式JSON的一種“使用模式”,可以讓網頁從別的網域要數據。另一個解決這個問題的新方法是跨來源資源共享。
由于同源策略,一般來說位于www.42du.cn的網頁無法與不是 www.42du.cn的服務器溝通,而HTML的 < script >元素是一個例外。利用 < script >元素的這個開放策略,網頁可以得到從其他來源動態產生的JSON數據,而這種使用模式就是所謂的JSONP。用JSONP抓到的數據并不是JSON,而是任意的JavaScript,用 JavaScript解釋器運行而不是用JSON解析器解析。
2 Jsonp基本原理為了理解這種模式的原理,先想像有一個回傳JSON文件的URL,而JavaScript 程序可以用XMLHttpRequest跟這個URL要數據。假設我們的URL是 http://tools.42du.cn/jsonp/st... 。假設iFat3的st_no是3,當瀏覽器通過URL傳遞iFat3的st_id,也就是抓取http://tools.42du.cn/jsonp/st...,得到:
{"st_no":3,"st_name":"iFat3","st_desc":"iFat3是學校的超級學渣"}
這個JSON數據可能是依據傳過去URL的查詢參數動態產生的。
這個時候,把 < script >元素的src屬性設成一個回傳JSON的URL是可以想像的,這也代表從HTML頁面通過script元素抓取 JSON是可能的。
然而,一份JSON文件并不是一個JavaScript程序。為了讓瀏覽器可以在 < script >元素運行,從src里URL 回傳的必須是可運行的JavaScript。在JSONP的使用模式里,該URL回傳的是由函數調用包起來的動態生成JSON,這就是JSONP的“填充(padding)”或是“前輟(prefix)”的由來。
慣例上瀏覽器提供回調函數的名稱當作送至服務器的請求中命名查詢參數的一部分,例如: