jsonp2

解决如何用jsonp替代axios抓取qq音乐数据

1.前端准备工作

封装jsonp

更改配置文件设置路径

build>webpack.base.conf.js

  resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
      '@': resolve('src'),
       //设置common路径别名
      "common":resolve('src/common'),
      "components":resolve('src/components'),
      "api":resolve('src/api'),
      "base":resolve('src/base'),
    }
  },

设置路径别名后就可以这样引用了:

import jsonp from 'common/js/jsonp.js'

封装路径src>common>js>jsonp.js

import originJsonp from 'jsonp'

export default function jsonp(url, data, option) {
  
  url += (url.indexOf('?') < 0 ? '?' : '&') + param(data)
//console.log(option)
  return new Promise((resolve, reject) => {
    originJsonp(url, option, (err, data) => {
      if (!err) {
       // console.log(data)
        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) : ''
}

在src>api下配置请求test.js文件

import jsonp from 'common/js/jsonp'

const debug = process.env.NODE_ENV !== 'production'

export function test(){
  //请求的路由
    url='http://localhost:8900/api/getinfo'
  //请求的数据
  const data =  {
    g_tk: 1928093487,
    inCharset: 'utf-8',
    outCharset: 'utf-8',
    notice: 0,
    platform: 'yqq',
    hostUin: 0,
    sin: 0,
    ein: 29,
    sortId: 5,
    needNewCode: 0,
    categoryId: 10000000,
    rnd: Math.random(),
    format: 'json'
    }
    //jsonp的回调函数
    options={{callback:'jsonp'}}
//向自己的后台发送jsonp请求
return jsonp(url,data,options)
}

在组件里调用test.js里的test方法发送请求抓取数据

测试组件为test.vue

<template>
    <div>
        <div>{{list}}</div>
    </div>
</template>

<script>
//导入test jsonp请求方法
import {test} from 'api/test'
    export default {
        data(){
            return{
                list:{}
            }
        },
        created() {
               // this.$nextTick(
                    this._test()
                //)
            },
        methods:{
            _test(){
                test().then((res) => {
                    
                    this.list=res.data.list
                })
            }

        }
    }
</script>

<style scoped>

</style>

2.后端处理

const express = require('express')
const axios = require('axios')
const app = express()

const appData = require('./data.json')
const seller = appData.seller

const router = express.Router()



//接收前端的jsonp请求
router.get('/getinfo', function(req, res, next) {
  console.log(req.query)
  var _callback = req.query.callback;
  var _data = seller;

  //后端接受jsonp请求后自己的服务器向qq音乐服务器发送axios请求
  var url = 'https://c.y.qq.com/splcloud/fcgi-bin/fcg_get_diss_by_tag.fcg'
  axios.get(url, {
    //设置请求头绕过qq音乐的拦截
    headers: {
      referer: 'https://c.y.qq.com/',
      host: 'c.y.qq.com'
    },
    //请求的数据
    params:req.query
  }).then((response) => {
    //获取qq服务器返回的数据后向我们的前端发送接收数据
    console.log(JSON.stringify(response.data))
    res.type('text/javascript');
    res.send(_callback + '(' + JSON.stringify(response.data) + ')');
          }).catch((e) => {
                console.log(e)
          })

})

app.use('/api', router)

app.use(express.static('./dist'))

const port = process.env.PORT || 8900

module.exports = app.listen(port, function (err) {
  if (err) {
    console.log(err)
    return
  }
  console.log('Listening at http://localhost:' + port + '\n')
})

至此就完成如何用jsonp代替axios发送请求抓取数据了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值