1. 程式人生 > 程式設計 >在vue中使用jsonp進行跨域請求介面操作

在vue中使用jsonp進行跨域請求介面操作

前言:

這裡我們使用的是第三方外掛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進行跨域請求介面操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。