JSONP是一種跨域請(qǐng)求數(shù)據(jù)的技術(shù),它利用了script標(biāo)簽可以跨域請(qǐng)求資源的特性來(lái)獲取數(shù)據(jù)。Vue在使用JSONP請(qǐng)求數(shù)據(jù)時(shí),需要先安裝jsonp插件。
安裝jsonp的方式有兩種,一種是直接在index.html中引入jsonp的CDN,另一種是使用npm安裝jsonp庫(kù)。
<script src="https://cdn.jsdelivr.net/npm/jsonp@0.2.1/jsonp.min.js"></script> //使用npm安裝jsonp npm install jsonp --save
安裝完成jsonp后,可以在Vue項(xiàng)目中引入jsonp。首先在Vue組件中引入jsonp庫(kù)。
import jsonp from 'jsonp'
然后,在需要請(qǐng)求數(shù)據(jù)的函數(shù)中使用jsonp函數(shù)進(jìn)行數(shù)據(jù)請(qǐng)求。
getData() { //jsonp的url必須加上callback參數(shù) const url = 'https://someurl.com/data?callback=callbackFunction' jsonp(url, null, (err, data) =>{ if (err) { console.error(err.message) } else { console.log(data) } }) }
在使用jsonp請(qǐng)求數(shù)據(jù)時(shí),需要注意以下幾點(diǎn):
1. jsonp的url必須加上callback參數(shù)。這個(gè)參數(shù)指定了服務(wù)器返回的數(shù)據(jù)要調(diào)用的函數(shù)名。所以需要在客戶端定義這個(gè)函數(shù)。
window.callbackFunction = function(data) { console.log(data); }
2. jsonp的url中不能包含問(wèn)號(hào)(?)或者#號(hào)。因?yàn)闉g覽器使用script標(biāo)簽請(qǐng)求數(shù)據(jù)時(shí)會(huì)將url中的#號(hào)或者問(wèn)號(hào)替換為%23和%3F,從而導(dǎo)致服務(wù)器無(wú)法正確解析url。
3. jsonp請(qǐng)求不支持POST方法。因?yàn)槭褂胹cript標(biāo)簽只能使用GET方法請(qǐng)求數(shù)據(jù)。
4. jsonp請(qǐng)求不支持設(shè)置請(qǐng)求頭。因?yàn)閟cript標(biāo)簽只能設(shè)置src屬性,并不能設(shè)置請(qǐng)求頭。