在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 相关文章推荐
javascript实现动态增加删除表格行(兼容IE/FF)
Apr 02 Javascript
js 弹出菜单/窗口效果
Oct 30 Javascript
jQuery 绑定事件到动态创建的元素上的方法实例
Aug 18 Javascript
使用GruntJS构建Web程序之合并压缩篇
Jun 06 Javascript
javascript与css3动画结合使用小结
Mar 11 Javascript
jQuery设置指定网页元素宽度和高度的方法
Mar 25 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
Oct 21 Javascript
浅谈js中同名函数和同名变量的执行问题
Feb 12 Javascript
Vue使用json-server进行后端数据模拟功能
Apr 17 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
Sep 12 Javascript
读懂CommonJS的模块加载
Apr 19 Javascript
微信小程序自定义底部弹出框动画
Nov 18 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 IPV6正则表达式验证代码
2010/02/16 PHP
基于header的一些常用指令详解
2013/06/06 PHP
yii用户注册表单验证实例
2015/12/26 PHP
PHP的PDO事务与自动提交
2019/01/24 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
javascript实现动态CSS换肤技术的脚本
2007/06/29 Javascript
JS学习之一个简易的日历控件
2010/03/24 Javascript
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
2012/02/16 Javascript
javascript获取元素偏移量的方法有哪些
2014/06/24 Javascript
jquery通过closest选择器修改上级元素的方法
2015/03/17 Javascript
15个常用的jquery代码片段
2015/12/19 Javascript
jQuery中each()、find()和filter()等节点操作方法详解(推荐)
2016/05/25 Javascript
jQuery实现简单倒计时功能的方法
2016/07/04 Javascript
vue.js初学入门教程(1)
2016/11/03 Javascript
js实现文字向上轮播功能
2017/01/13 Javascript
jquery拼接ajax 的json和字符串拼接的方法
2017/03/11 Javascript
Javascript实现的StopWatch功能示例
2017/06/13 Javascript
JS实现颜色的10进制转化成rgba格式的方法
2017/09/04 Javascript
使用FileReader API创建Vue文件阅读器组件
2018/04/03 Javascript
JS中判断某个字符串是否包含另一个字符串的五种方法
2018/05/03 Javascript
webpack4 + react 搭建多页面应用示例
2018/08/03 Javascript
浅谈在不使用ssr的情况下解决Vue单页面SEO问题(2)
2018/11/08 Javascript
小程序自定义日历效果
2018/12/29 Javascript
使用vue-cli脚手架工具搭建vue-webpack项目
2019/01/14 Javascript
如何能分清npm cnpm npx nvm
2019/01/17 Javascript
vue.js的状态管理vuex中store的使用详解
2019/11/08 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
2020/09/09 Javascript
Python简单定义与使用字典dict的方法示例
2017/07/25 Python
Python中用psycopg2模块操作PostgreSQL方法
2017/11/28 Python
Python实现二维数组输出为图片
2018/04/03 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
flask入门之文件上传与邮件发送示例
2018/07/18 Python
python爬虫之线程池和进程池功能与用法详解
2018/08/02 Python
python3使用matplotlib绘制散点图
2019/03/19 Python
春季防火方案
2014/05/10 职场文书
浅谈什么是SpringBoot异常处理自动配置的原理
2021/06/21 Java/Android