音乐播放器项目记录

《Vue项目中jsonp抓取数据实现方式》

Posted by Charlene on October 20, 2019

先安装依赖:cnpm install –save jsonp

1. 然后创建一个jsonp.js

import originJSONP from 'jsonp'
export default function jsonp(url, data, option) {
  <!-- 地址判断和调用处理地址函数 -->
  url += (url.indexOf('?') < 0 ? '?' : '&') + param(data)
  <!-- 返回一个Promise -->
  return new Promise((resolve, reject) => {
    originJSONP(url, option, (err, data) => {
      if (!err) {
        resolve(data)
      } else {
        reject(err)
      }
    })
  })
}

2. 在jsonp.js中创建一个函数处理地址

<!-- 把data拼接到url上 -->
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文件夹,创建一个recommend.js,config.js 主要用途是处理请求地址url和头部的公共参数,引入刚刚的jsonp.js

import jsonp from 'common/js/jsonp'   // jsonp.js文件地址
import {commonParams, options} from './config'  //把congfig.js 对象导入进来
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
    })

    return jsonp(url, data, options)
}
config.js //用途把公共的参数提取出来
export const commonParams = {
    g_tk: 5381,
    inCharset: 'utf-8',
    outCharset: 'utf-8',
    notice: 0,
    format: 'jsonp'
}

export const options = {
    param: 'jsonpCallback'
}

export const ERR_OK = 0  // 语义化

4. 在组件recommend.vue中获取数据

<template>
    <div class="recommend">
        <div class="recommend-content">
            <div class="slider-wrapper">
            </div>
            <div class="recommend-list">
                <h1 class="list-title">热门歌单推荐</h1>
                <ul>
                </ul>
            </div>
        </div>
    </div>
</template>

<script type="text/ecmascript-6">
    import {getRecommend} from 'api/recommend'
    import {ERR_OK} from 'api/config'

    export default {
        created () {
           this._getRecommend()
        },
        methods: {
            _getRecommend() {
                getRecommend().then((res) => {
                    if (res.code === ERR_OK) {         //语义化
                        console.log(res.data.slider)
                    }
                })
            }
        }
    }
</script>

5. 获取到数据

Image