在vue中使用jsonp進(jìn)行跨域請求接口操作
前言:
這里我們使用的是第三方插件jsonp。
github網(wǎng)址:https://github.com/webmodules/jsonp
1、安裝
npm install jsonp -S
2、引入
一般新建一個(gè)js文件來引入原始jsonp插件,然后對原始插件進(jìn)行封裝,對跨域接口參數(shù)的拼接,封裝好這個(gè)jsonp文件后export出去,之后在哪里用到就再在那里import。
1.新建jsonp.js文件來封裝原始jsonp插件
// 引入原始jsonp插件 import originJsonp from 'jsonp' /* 封裝原jsonp插件,返回promise對象 url: 請求地址 data:請求的json參數(shù) option:其他json參數(shù),默認(rèn)直接寫空對象即可 */ export default function jsonp (url, data, option) { url += (url.indexOf('?') < 0 ? '?' : '&') + param(data) return new Promise((resolve, reject) => { // originJsonp中的參數(shù)說明可以到前言中的github中查看 originJsonp(url, option, (err, data) => { if (!err) { resolve(data) } else { reject(err) } }) }) } /* 封裝url參數(shù)的拼接 */ function param (data) { let url = '' for (var k in data) { let value = data[k] !== undefined ? data[k] : '' // 防止參數(shù)為中文時(shí)出現(xiàn)亂碼,把字符串作為 URI 組件進(jìn)行編碼 url += `&${k}=${encodeURIComponent(value)}` } return url ? url.substring(1) : '' }
3、使用
可以在專門請求接口的js文件夾中新建一個(gè)getCurrentCity.js文件來跨域獲取接口數(shù)據(jù)。
// 引入封裝好的jsonp import jsonp from 'common/js/jsonp.js' // 假設(shè)這里為跨域請求當(dāng)前城市的接口 export function getCurrentCity () { // 接口地址 let url = 'https://api.map.baidu.com' // 所需參數(shù) let datas = { 'qt': 'dec', 'ie': 'utf-8', 'oue': 1, 'fromproduct': 'jsapi', 'res': 'api', 'ak': 'QWilijLzYd6pCmTrHilAeWjbG41zMiXc' } return jsonp(url, datas, {}) }
4、最后在vue組件中取到接口數(shù)據(jù)
import {getCurrentCity} from 'common/apis/getCurrentCity.js' export default { methods:{ _getCurrentCity () { // 在這里就可以獲取到當(dāng)前城市的接口數(shù)據(jù)了 getCityCurrent().then((res) => { // 打印出獲取到的數(shù)據(jù) console.log(res) }).catch((err) => { console.log(err) }) } }, mounted () { this._getCurrentCity() } }
補(bǔ)充知識(shí):Vue中關(guān)于axios和jsonp的封裝
我就廢話不多說了,大家還是直接看代碼吧~
import qs from 'qs' import axios from 'axios' //攔截器 axios.interceptors.request.use(function (config) { console.log('正在發(fā)送請求哦...')//添加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,data={}){ return new Promise((resolve,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,option,callbackFn) {name:1,age:20} www.aaa.com/? */ export default function(url,data,option){ url+=(url.indexOf('?')<0 ? '?' : '&' )+param(data); return new Promise(function(resolve,reject){ originJSONP(url,option,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進(jìn)行跨域請求接口操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用vue-route 的 beforeEach 實(shí)現(xiàn)導(dǎo)航守衛(wèi)(路由跳轉(zhuǎn)前驗(yàn)證登錄)功能
在網(wǎng)站中普遍會(huì)遇到這樣的需求,路由跳轉(zhuǎn)前做一些驗(yàn)證,比如登錄驗(yàn)證(未登錄去登錄頁)。下面腳本之家小編給大家?guī)砹耸褂胿ue-route 的 beforeEach 實(shí)現(xiàn)導(dǎo)航守衛(wèi)(路由跳轉(zhuǎn)前驗(yàn)證登錄)功能,感興趣的朋友一起看看吧2018-03-03Electron-vue腳手架改造vue項(xiàng)目的方法
這篇文章主要介紹了Electron-vue腳手架改造vue項(xiàng)目的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10vue項(xiàng)目中實(shí)現(xiàn)圖片預(yù)覽的公用組件功能
小編接到查看影像的功能需求,根據(jù)需求,多個(gè)組件需要用到查看影像的功能,所以考慮做一個(gè)公用組件,通過組件傳值的方法將查看影像文件的入?yún)鬟^去。下面小編通過實(shí)例代碼給大家分享vue項(xiàng)目中實(shí)現(xiàn)圖片預(yù)覽的公用組件功能,需要的朋友參考下吧2018-10-10使用Vue.$set()或者Object.assign()修改對象新增響應(yīng)式屬性的方法
vue代碼中,只要在data對象里定義的對象,賦值后,任意一個(gè)屬性值發(fā)生變化,視圖都會(huì)實(shí)時(shí)變化,這篇文章主要介紹了使用Vue.$set()或者Object.assign()修改對象新增響應(yīng)式屬性,需要的朋友可以參考下2022-12-12Vue computed 計(jì)算屬性代碼實(shí)例
在本篇文章里小編給大家分享的是關(guān)于Vue computed 計(jì)算屬性代碼實(shí)例,需要的朋友們可以參考下。2020-04-04