【跨域】JSONP
阿新 • • 發佈:2020-08-13
可以利用 JSONP 來跨域的原理是:利用<script>標籤沒有跨域限制的漏洞,網頁可以獲得從其他來源動態產生的 JSON 資料,JSONP 請求一定需要對方的伺服器做支援。
JSON 的實現流程:
1.宣告一個回撥函式,函式名作為傳遞給跨域請求資料的伺服器的引數值。
2.建立一個<script>標籤,把跨域需要的 API 資料介面地址,賦值給<script>的src,由於 JSON 處理的是 get 請求,所以要在這個 src 後面再拼接上回調函式名和需要處理的資料。
3.伺服器接收到請求後,需要進行拼接操作:回撥函式名和伺服器準備返回的資料要拼成字串,比如回撥函式名是 back,準備的資料放在回撥函式的引數中,back('callback success!')
4.伺服器把準備好的資料通過 HTTP 協議返回給客戶端,客戶端再呼叫之前宣告的回撥函式,對返回的資料進行操作。
可能會遇到多個 JSONP 請求的回撥函式名相同,所以還是自己封裝一個 JSONP 函式比較好。
function jsonp({url, params, callback}) { return new Promise((resolve, reject) => { let script = document.createElement('script'); window[callback] = function(data) { // 定義一個全域性函式,用來處理成功返回資料的情況 resolve(data); document.body.removeChild(script); } params = {...params, callback}; let res = []; for(let key in params) { res.push(`${key}=${params[key]}`); } script.src= `${url}?${res.join('$')}`; document.body.appendChild(script); }) }
把這個封裝好的 jsonp 放在你的 html 檔案或者 js 檔案中,接下來就可以呼叫了。
// 呼叫jsonp jsonp({ url: 'http://localhost:8888/test-jsonp', params: { wd: 'to be or not to be' }, callback: 'back' }).then(data => { console.log(data); })
在網頁上做好準備之外,還需要在伺服器端監聽 8888 埠,此處我用的是 nodejs 裡的 express 搭建出的專案,再新增 test-jsonp 的路由就可以了。
開啟伺服器,訪問網頁,就可以看到伺服器中列印處理的結果:
網頁打印出來的是: