vue ajax jsonp封装,在vue中应用jsonp

本文详细解析了Vue.js中实现Jsonp跨域的原理,包括Jsonp并非真正的Ajax请求,而是利用script标签的跨域特性,动态创建script标签并设置src属性为服务端接口,携带回调函数参数。服务端返回数据时,通过预先在客户端注册的全局回调函数传递数据。文中还给出了封装Jsonp请求和调用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

推荐想学Vue的同学看下黄轶老师的音乐App课程

jsonp为什么能跨域?

1、 jsonp发送的并不是ajax请求;

2、 利用动态创建一个script标签,因为script标签是没有同源策略限制的,是可以跨域的;

3、 把这个script标签的src指向我们请求的服务端地址,这个地址会携带一个参数:callback ,一个回调函数,服务端会把数据通过这个回调函数返回给客户端,但是客户端没有这个函数怎么接收呢?所以在发送请求之前,要在全局(window)注册这样一个方法,利用这个方法,来获得数据。

案例:老师的源码

1、 安装jsonp;

npm install jsonp

2、 封装jsonp;

import originJSONP from 'jsonp'

/**

* 封装jsonp

* @param {*} url 原始的jsonp第一个参数是url,第二个参数是option,这里为了比较好写参数做了下封装

* @param {obj} data 参数

* @param {*} option jsonp的option

*/

export default function jsonp(url, data, option) {

// 如果url没有?就加一个?拼接

url += (url.indexOf('?') < 0 ? '?' : '&') + param(data)

return new Promise((resolve, reject) => {

// 原始jsonp的三个参数,url、option、回调函数

originJSONP(url, option, (err, data) => {

// 类似node的设计,如果err是null,表示成功,data是后端返回的数据

if (!err) {

resolve(data)

} else {

reject(err)

}

})

})

}

export function param(data) {

let url = ''

for (var k in data) {

let value = data[k] !== undefined ? data[k] : ''

url += '&' + k + '=' + encodeURIComponent(value)

}

return url ? url.substring(1) : ''

}

3、 封装API

import jsonp from 'common/js/jsonp'

import { commonParams, options } from './config'

export function getRecommend () {

const url = 'https://c.y.qq.com/musichall/fcgi-bin/fcg_yqqhomepagerecommend.fcg'

const data = Object.assign({}, commonParams, {

platform: 'h5',

uin: 0,

needNewCode: 1

})

// 这里返回一个promise对象

return jsonp(url, data, options)

}

4、调用API

created () {

this._getRecommed()

},

methods: {

/**

* @augments

* 获取qq音乐数据

*/

_getRecommed() {

getRecommend().then((res) => {

if (res.code === ERR_OK) {

this.banners = res.data.slider

}

})

},

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值