jsonp封装使用(二)

原理:不是ajax请求,是动态创建script标签进行跨域的,将script的src指向我们请求的服务端地址,npm安装jsonp,axios,编写jsonp.js引入jsonp,并对原来的jsonp做一个简单的封装

1. src->common->js中,编写jsonp.js,引入jsonp插件,并对其做一个简单的封装

import originJsonp from 'jsonp'
 
// url是一个地址,请求通过data拼接到url上,并返回一个promise
export default function jsonp(url, data, option) {
  // url没有?时要先添加一个
  url += (url.indexOf('?') < 0 ? '?' : '&') + param(data)
 
  return new Promise((resolve, reject) => {
    originJsonp(url, option, (err, data) => {
      if (!err) {
        resolve(data)
      } else {
        reject(err)
      }
    })
  })
}
 
// 对要与url拼接的data进行处理
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) : ''
}

用promise对原生的jsonp进行封装之后,即可用jsonp真实的抓取我们的线上数据,获取数据通常会获取一些方法,在src-api目录下给每一个部分封装获取它相关数据的方法,我们这里做的是推荐相关,所以在这里建一个recommend.js,实现getRecommend方法,这个方法的原理就是利用jsonp获取数据,所以要先import jsonp,首先要定义url,data指的就是Query String Parameters,我们将相同的参数进行封装,所以在configure.js中进行公共参数的封装

2. 在api->config.js中统一参数格式

export const commonParams = {
    g_tk: 1251607169,
    inCharset: 'utf-8',
    outCharset: 'utf-8',
    notice: 0,
    format: 'jsonp'
}
 
export const options = {
    param: 'jsonpCallback'
}
 
// "code":0,正确的值为0
export const ERR_OK = 0

3. 引入jsonp.js和conifg.js,编写recommend.js获取jsonp数据

import jsonp from 'common/js/jsonp'
import {commonParams, options} from './config.js'

export function getRecommend() { // 利用jsonp抓取推荐数据
    const url = 'https://c.y.qq.com/musichall/fcgi-bin/fcg_yqqhomepagerecommend.fcg'
    const data = Object.assign({}, commonParams, { // assign合并对象
        platform: 'h5',
        uni: 0,
        needNewCode: 1
    })
 
    return jsonp(url, data, options)
}
 

4.在recommend.vue中接收并处理recommend.js获取的数据,getDiscList是后来获取的歌单列表

import {getRecommend} from 'api/recommend' // 引入js中定义的方法
import {ERR_OK} from 'api/config'
data() {
    return {
      recommends: [],
      discList: []
    }
  }
created() {
  //  setTimeout(() => {
  //    this._getRecommend() 
  //  }, 2000);
    this._getRecommend() 
    // 模拟loading效果
  },
  methods: {
    _getRecommend() {
      getRecommend().then((res) => { // res对应的就是json对象,之前已经import该方法了
        if (res.code === ERR_OK) {
          // console.log(res.data.slider)
          this.recommends = res.data.slider
        }
      })
    }

}

5.引入

转自https://blog.csdn.net/qq_22317389/article/details/80506286

猜你喜欢

转载自blog.csdn.net/horizon_06/article/details/82013928