在vue中使用jsonp進行跨域請求介面操作
阿新 • • 發佈:2020-10-29
前言:
這裡我們使用的是第三方外掛jsonp。
github網址:https://github.com/webmodules/jsonp
1、安裝
npm install jsonp -S
2、引入
一般新建一個js檔案來引入原始jsonp外掛,然後對原始外掛進行封裝,對跨域介面引數的拼接,封裝好這個jsonp檔案後export出去,之後在哪裡用到就再在那裡import。
1.新建jsonp.js檔案來封裝原始jsonp外掛
// 引入原始jsonp外掛 import originJsonp from 'jsonp' /* 封裝原jsonp外掛,返回promise物件 url: 請求地址 data:請求的json引數 option:其他json引數,預設直接寫空物件即可 */ export default function jsonp (url,data,option) { url += (url.indexOf('?') < 0 ? '?' : '&') + param(data) return new Promise((resolve,reject) => { // originJsonp中的引數說明可以到前言中的github中檢視 originJsonp(url,option,(err,data) => { if (!err) { resolve(data) } else { reject(err) } }) }) } /* 封裝url引數的拼接 */ function param (data) { let url = '' for (var k in data) { let value = data[k] !== undefined ? data[k] : '' // 防止引數為中文時出現亂碼,把字串作為 URI 元件進行編碼 url += `&${k}=${encodeURIComponent(value)}` } return url ? url.substring(1) : '' }
3、使用
可以在專門請求介面的js資料夾中新建一個getCurrentCity.js檔案來跨域獲取介面資料。
// 引入封裝好的jsonp import jsonp from 'common/js/jsonp.js' // 假設這裡為跨域請求當前城市的介面 export function getCurrentCity () { // 介面地址 let url = 'https://api.map.baidu.com' // 所需引數 let datas = { 'qt': 'dec','ie': 'utf-8','oue': 1,'fromproduct': 'jsapi','res': 'api','ak': 'QWilijLzYd6pCmTrHilAeWjbG41zMiXc' } return jsonp(url,datas,{}) }
4、最後在vue元件中取到介面資料
import {getCurrentCity} from 'common/apis/getCurrentCity.js' export default { methods:{ _getCurrentCity () { // 在這裡就可以獲取到當前城市的介面資料了 getCityCurrent().then((res) => { // 打印出獲取到的資料 console.log(res) }).catch((err) => { console.log(err) }) } },mounted () { this._getCurrentCity() } }
補充知識:Vue中關於axios和jsonp的封裝
我就廢話不多說了,大家還是直接看程式碼吧~
import qs from 'qs' import axios from 'axios' //攔截器 axios.interceptors.request.use(function (config) { console.log('正在傳送請求哦...')//新增loading效果 return config; },function (error) { return Promise.reject(error); }); // Add a response interceptor axios.interceptors.response.use(function (response) { console.log('請求成功啦...') return response; },function (error) { return Promise.reject(error); }); const ajax={ post:function(url,data={}){ return new Promise((resolve,reject)=>{ axios.post(url,qs.stringify(data)).then(function(res){ resolve(res.data) }).catch(function(err){ reject(err) }) }) },get:function(url,reject)=>{ axios.get(url,{params:qs.stringify(data)}).then(function(res){ resolve(res.data) }).catch(function(err){ reject(err) }) }) },} export default ajax;
在main.js中
import ajax from './common/api/index.js'
Vue.prototype.$post=ajax.post Vue.prototype.$get=ajax.get
jsonp
import originJSONP from 'jsonp' /* jsonp(url,callbackFn) {name:1,age:20} www.aaa.com/? */ export default function(url,option){ url+=(url.indexOf('?')<0 ? '?' : '&' )+param(data); return new Promise(function(resolve,reject){ originJSONP(url,function(err,res){ if(!err){ resolve(res); }else{ reject(err) } }) }) } /* {name='aa',age=20} &name=aa&age=20 */ function param(data){ let url=''; for(let key in data){ let item =data[key]!==undefined ? data[key] : ''; url+=`&${key}=${encodeURIComponent(item)}` } return url ? url:''; }
以上這篇在vue中使用jsonp進行跨域請求介面操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。