vue + webpack如何绕过QQ音乐接口对host的验证详解


Posted in Javascript onJuly 01, 2018

前言

最近在使用vue2.5+webpack3.6撸一个移动端音乐项目, 获取全部歌单json数据时遇到了接口对host和referer的限制 ,故不能直接在前端使用jsonp对接口数据的读取。 

一、 先实现使用jsonp读取的方式安装jsonp模块并, 封装请求方法

1. $ npm install -S jsonp

2. 封装import originJSONP from 'jsonp'

function jsonp(url, data, options) {
 // 如果存在?则直接加params(data), 否则先加?再加 params(data)
 url += (url.indexOf('?') < 0 ? '?' : '') + params(data)
 // 结果返回一个Promise对象
 return new Promise((resolve, reject) => {
 originJSONP(url, options, (err, data) => {
  if (!err) {
  resolve(data)
  } else {
  reject(err)
  }
 })
 })
}

function params(data) {
 let params = ''
 for (var k in data) {
 let value = data[k] != undefined ? data[k] : ''
 // url += '&' + k + '=' + encodeURIComponent(value) ES5
 params += `&${k}=${encodeURIComponent(value)}` // ES6
 }
 // 去掉首个参数的&, 因为jsonp方法中参数自带&
 return params ? params.substring(1) : ''
}

3. 请求数据

vue + webpack如何绕过QQ音乐接口对host的验证详解

# 代码
 const commonParams = {
 g_tk: 5381,
 inCharset: 'utf-8',
 outCharset: 'utf-8',
 notice: 0,
 format: 'jsonp'
}
const options = {
 param: 'jsonpCallback'
}

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)
}

4. 组件内调用getRecommend()方法, 获取数据

methods: {
 _getRecommend() {
 getRecommend().then((res) => {
  // ERR_OK = 0是自定义的语义化参数, 对应返回json对象的code
  if (res.code === ERR_OK) {
  console.log(res.data)
  const data = res.data
  this.slider = data.slider
  }
 })
 }
},
created() {
 this._getRecommend()
}

console.log(res.data)可打印出json数据

vue + webpack如何绕过QQ音乐接口对host的验证详解

以上是使用jsonp的方式请求数据, 但对于被host和referer限制的json, 需要绕过host验证,先让服务端请求接口,前端页面再通过服务端请求数据。而不能像jsonp那样直接前端请求json对象。报错如下

vue + webpack如何绕过QQ音乐接口对host的验证详解

二、后端axios(ajax)请求接口数据

1.  定义后端代理请求 build/webpack.dev.config.js

const axios = require('axios')
devServer: {
 before(app) {
 app.get('/api/getDiscList', function (req, res) {
  var url = 'https://c.y.qq.com/splcloud/fcgi-bin/fcg_get_diss_by_tag.fcg'
  axios.get(url, {
  headers: {
   referer: 'https://c.y.qq.com/',
   host: 'c.y.qq.com'
  },
  params: req.query
  }).then((response) => {
  res.json(response.data)
  }).catch((e) => {
  console.log(e)
  })
 })
 },
 # ...其他原来的代码
}

2.  前端请求后端已获取的远程数据

import axios from 'axios'function getDiscList() {
 // const url = 'https://c.y.qq.com/splcloud/fcgi-bin/fcg_get_diss_by_tag.fcg'
 const url = '/api/getDiscList'
 const data = Object.assign({}, commonParams, {
 // 以下参数自行参考源json文件的Query String Parameters
 platform: 'yqq',
 uin: 0,
 needNewCode: 0,
 hostUin: 0,
 sin: 0,
 ein: 29,
 sortId: 5,
 rnd: Math.random(),
 categoryId: 10000000,
 format: 'json'
 })
 return axios.get(url, {
 params: data
 }).then((res) => {
 return Promise.resolve(res.data)
 })
}

vue + webpack如何绕过QQ音乐接口对host的验证详解

3. 组件内调用getDiscList()方法, 可输出json数据

methods: {
 _getRecommend() {
 getRecommend().then((res) => {
  if (res.code === ERR_OK) {
  // console.log(res.data)
  const data = res.data
  this.slider = data.slider
  }
 })
 },
 _getDiscList() {
 getDiscList().then((res) => {
  console.log(res.data)
 })
 }
},
created() {
 this._getRecommend()
 this._getDiscList()
}

总结, vue+webpack项目中,如需请求获取远程json数据时, 一般由两种情况:

1. 未受host和referer限制的前端组件可以直接使用jsonp插件请求json对象

2. 受host和referer限制需要验证的, 通过后端代理方式,使用axios请求, 前端再请求后端json对象

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JavaScript开发时的五个注意事项
Dec 08 Javascript
Javascript异步编程的4种方法让你写出更出色的程序
Jan 17 Javascript
xmlhttp缓存清除的2种解决方法
Dec 13 Javascript
jQuery通过Ajax返回JSON数据
Apr 28 Javascript
jQuery的几个我们必须了解的特点
May 03 Javascript
JavaScript知识点总结(六)之JavaScript判断变量数据类型
May 31 Javascript
浅析Javascript ES6中的原生Promise
Aug 25 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
Oct 27 Javascript
详谈Node.js之操作文件系统
Aug 29 Javascript
vue2.0使用v-for循环制作多级嵌套菜单栏
Jun 25 Javascript
详解Vue项目部署遇到的问题及解决方案
Jan 11 Javascript
vue实现axios图片上传功能
Aug 20 Javascript
关于Vue组件库开发详析
Jul 01 #Javascript
D3.js实现拓扑图的示例代码
Jun 30 #Javascript
详解angular如何调用HTML字符串的方法
Jun 30 #Javascript
angular6.0使用教程之父组件通过url传递id给子组件的方法
Jun 30 #Javascript
基于webpack4搭建的react项目框架的方法
Jun 30 #Javascript
AngularJs分页插件使用详解
Jun 30 #Javascript
ionic grid(栅格)九宫格制作详解
Jun 30 #Javascript
You might like
一个php作的文本留言本的例子(六)
2006/10/09 PHP
PHP中HTTP方式下的Gzip压缩传输方法举偶
2007/02/15 PHP
PHP下几种删除目录的方法总结
2007/08/19 PHP
Phpbean路由转发的php代码
2008/01/10 PHP
Apache连接PHP后无法启动问题解决思路
2015/06/18 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
2016/05/04 PHP
php版阿里大于(阿里大鱼)短信发送实例详解
2016/11/30 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
用javascript父窗口控制只弹出一个子窗口
2007/04/10 Javascript
JavaScript DOM学习第四章 getElementByTagNames
2010/02/19 Javascript
javascript new后的constructor属性
2010/08/05 Javascript
工作中常用到的JS表单验证代码(包括例子)
2010/11/11 Javascript
js去除输入框中所有的空格和禁止输入空格的方法
2014/06/09 Javascript
省市二级联动小案例讲解
2016/07/24 Javascript
js实现点击每个li节点,都弹出其文本值及修改
2016/12/15 Javascript
详解微信小程序 登录获取unionid
2017/06/27 Javascript
js实现拖拽上传图片功能
2017/08/01 Javascript
Vue 中mixin 的用法详解
2018/04/23 Javascript
vue弹窗组件的实现示例代码
2018/09/10 Javascript
原生js实现获取form表单数据代码实例
2019/03/27 Javascript
[50:01]Ti4 冒泡赛第二天 NEWBEE vs Titan
2014/07/15 DOTA
Python SQLite3数据库操作类分享
2014/06/10 Python
Python采集腾讯新闻实例
2014/07/10 Python
python进阶教程之函数对象(函数也是对象)
2014/08/30 Python
Python微信公众号开发平台
2018/01/25 Python
python实现操作文件(文件夹)
2019/10/31 Python
numpy中生成随机数的几种常用函数(小结)
2020/08/18 Python
Python如何使用ElementTree解析xml
2020/10/12 Python
产品质量承诺书
2014/03/27 职场文书
电气工程及其自动化专业求职信
2014/06/23 职场文书
机电系毕业生求职信
2014/07/11 职场文书
公司委托书范本5篇
2014/09/20 职场文书
药房管理制度范本
2015/08/06 职场文书
节水宣传标语口号
2015/12/26 职场文书
SQL Server 中的事务介绍
2022/05/20 SQL Server