在vue中使用jsonp进行跨域请求接口操作


Posted in Javascript onOctober 29, 2020

前言:

这里我们使用的是第三方插件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,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进行跨域请求接口操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery预览图片实现鼠标放上去显示实际大小
Jan 16 Javascript
jQuery手机拨号界面特效代码分享
Aug 27 Javascript
JavaScript reduce和reduceRight详解
Oct 24 Javascript
JavaScript实现经典排序算法之选择排序
Dec 28 Javascript
webpack2.0搭建前端项目的教程详解
Apr 05 Javascript
jQuery复合事件用法示例
Jun 10 jQuery
微信小程序实现换肤功能
Mar 14 Javascript
vue监听键盘事件的快捷方法【推荐】
Jul 11 Javascript
解决layui页面按钮点击无反应,也不报错的问题
Sep 29 Javascript
微信小程序自定义组件components(代码详解)
Oct 21 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
Nov 12 Javascript
vue-cli打包后本地运行dist文件中的index.html操作
Aug 12 Javascript
基于react项目打包css引用路径错误解决方案
Oct 28 #Javascript
design vue 表格开启列排序的操作
Oct 28 #Javascript
ant design vue导航菜单与路由配置操作
Oct 28 #Javascript
JS实现多功能计算器
Oct 28 #Javascript
JS实现简单贪吃蛇小游戏
Oct 28 #Javascript
VUE和Antv G6实现在线拓扑图编辑操作
Oct 28 #Javascript
在vue项目中引用Antv G2,以饼图为例讲解
Oct 28 #Javascript
You might like
PHP实现数组递归转义的方法
2014/08/28 PHP
yii2中使用Active Record模式的方法
2016/01/09 PHP
php中final关键字用法分析
2016/12/07 PHP
yii2 resetful 授权验证详解
2017/05/18 PHP
Laravel框架中自定义模板指令总结
2017/12/17 PHP
JSON PHP中,Json字符串反序列化成对象/数组的方法
2018/05/31 PHP
JS将秒换成时分秒实现代码
2013/09/03 Javascript
JavaScript简单实现网页回到顶部功能
2013/11/12 Javascript
使用js完成节点的增删改复制等的操作
2014/01/02 Javascript
页面加载完毕后滚动条自动滚动一定位置
2014/02/20 Javascript
javascript操作select元素实例分析
2015/03/27 Javascript
javascript运动框架用法实例分析(实现放大与缩小效果)
2016/01/08 Javascript
微信小程序 实现拖拽事件监听实例详解
2016/11/16 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
Vue keep-alive实践总结(推荐)
2017/08/31 Javascript
mescroll.js上拉加载下拉刷新组件使用详解
2017/11/13 Javascript
微信小程序页面跳转功能之从列表的item项跳转到下一个页面的方法
2017/11/27 Javascript
Vue 指令实现按钮级别权限管理功能
2019/04/23 Javascript
JavaScript模块管理的简单实现方式详解
2019/06/15 Javascript
layui自定义ajax左侧三级菜单
2019/07/26 Javascript
uniapp,微信小程序中使用 MQTT的问题
2020/07/11 Javascript
在vue项目中引用Antv G2,以饼图为例讲解
2020/10/28 Javascript
深入理解NumPy简明教程---数组2
2016/12/17 Python
python中is与双等于号“==”的区别示例详解
2017/11/21 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
2018/01/11 Python
Python使用functools实现注解同步方法
2018/02/06 Python
python中嵌套函数的实操步骤
2019/02/27 Python
详解基于python-django框架的支付宝支付案例
2019/09/23 Python
python打开文件的方式有哪些
2020/06/29 Python
字符串str除首尾字符外的其他字符按升序排列
2013/03/08 面试题
三年级语文教学反思
2014/02/01 职场文书
教师党员个人整改措施材料
2014/09/16 职场文书
副总经理岗位职责范本
2014/09/30 职场文书
执法作风整顿剖析材料
2014/10/11 职场文书
泰山导游词
2015/02/02 职场文书
环卫处个人工作总结
2015/03/04 职场文书