1. 程式人生 > 實用技巧 >【跨域】JSONP

【跨域】JSONP

  可以利用 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 的路由就可以了。

  開啟伺服器,訪問網頁,就可以看到伺服器中列印處理的結果:

  網頁打印出來的是:

  參考連結:https://juejin.im/post/6844903767226351623