在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 相关文章推荐
JS数组array元素的添加和删除方法代码实例
Jun 01 Javascript
js实现点击链接后延迟3秒再跳转的方法
Jun 05 Javascript
代码分析jQuery四种静态方法使用
Jul 23 Javascript
DeviceOne 让你一见钟情的App快速开发平台
Feb 17 Javascript
jquery插件autocomplete用法示例
Jul 01 Javascript
JS数组排序方法实例分析
Dec 16 Javascript
JS实现队列的先进先出功能示例
May 10 Javascript
JS实现仿饿了么在浏览器标签页失去焦点时网页Title改变
Jun 01 Javascript
Vue渲染函数详解
Sep 15 Javascript
如何通过shell脚本自动生成vue文件详解
Sep 10 Javascript
vue动态设置页面title的方法实例
Aug 23 Javascript
TypeScript 使用 Tuple Union 声明函数重载
Apr 07 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 Notice: Undefined index 错误提示解决方法
2010/08/29 PHP
PHP判断上传文件类型的解决办法
2015/10/20 PHP
PHP获取指定时间段之间的 年,月,天,时,分,秒
2016/06/05 PHP
PHP实现活动人选抽奖功能
2017/04/19 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
JQuery下关于$.Ready()的分析
2009/12/13 Javascript
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
Web开发之JavaScript
2012/03/29 Javascript
js 验证密码强弱的小例子
2013/03/21 Javascript
html文件中jquery与velocity变量中的$冲突的解决方法
2013/11/01 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
jQuery中hasClass()方法用法实例
2015/01/06 Javascript
jQuery实现冻结表头的方法
2015/03/09 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
2015/12/04 Javascript
js获取隐藏元素宽高的实现方法
2016/05/19 Javascript
jQuery+正则+文本框只能输入数字的实现方法
2016/10/07 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
Bootstrap php制作动态分页标签
2016/12/23 Javascript
Bootstrap源码学习笔记之bootstrap进度条
2016/12/24 Javascript
ES6新特性之变量和字符串用法示例
2017/04/01 Javascript
一次围绕setTimeout的前端面试经验分享
2017/06/15 Javascript
最基础的vue.js双向绑定操作
2017/08/23 Javascript
基于JS实现操作成功之后自动跳转页面
2020/09/25 Javascript
Python的collections模块中namedtuple结构使用示例
2016/07/07 Python
Python简单的制作图片验证码实例
2017/05/31 Python
python使用turtle库绘制时钟
2020/03/25 Python
Python实现随机创建电话号码的方法示例
2018/12/07 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
日本高端护肤品牌:Tatcha
2016/08/29 全球购物
洛杉矶时尚女装系列:J.ING US
2019/03/17 全球购物
大学生个人自荐信样本
2014/03/02 职场文书
部门主管竞聘书
2015/09/15 职场文书
2016清明节森林防火广播稿
2015/12/17 职场文书
《火烧云》教学反思
2016/02/23 职场文书
Go 语言中 20 个占位符的整理
2021/10/16 Golang
MongoDB数据库部署环境准备及使用介绍
2022/03/21 MongoDB