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 相关文章推荐
JQury slideToggle闪烁问题及解决办法
Jul 05 Javascript
node.js中的querystring.escape方法使用说明
Dec 10 Javascript
JQuery.validate在ie8下不支持的快速解决方法
May 18 Javascript
基于jQuery实现表格的排序
Dec 02 Javascript
浅谈sass在vue注意的地方
Aug 10 Javascript
JavaScrip关于创建常量的知识点
Dec 07 Javascript
javaScript手机号码校验工具类PhoneUtils详解
Dec 08 Javascript
移动端(微信等使用vConsole调试console的方法
Mar 05 Javascript
记一次用vue做的活动页的方法步骤
Apr 11 Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
May 22 Javascript
解决vue2中使用elementUi打包报错的问题
Sep 22 Javascript
微信小程序自定义tabBar的踩坑实践记录
Nov 06 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
解析dedeCMS验证码的实现代码
2013/06/07 PHP
PHP Hash算法:Times33算法代码实例
2015/05/13 PHP
php微信开发接入
2016/08/27 PHP
PHP设计模式之注册树模式分析
2018/01/26 PHP
PHP实现动态创建XML文档的方法
2018/03/30 PHP
解决FireFox下[使用event很麻烦]的问题
2006/11/26 Javascript
javascript 获取url参数和script标签中获取url参数函数代码
2010/01/22 Javascript
用jquery与css打造个性化的单选框和复选框
2010/10/20 Javascript
javascript中attribute和property的区别详解
2014/06/05 Javascript
node.js操作mysql(增删改查)
2015/07/24 Javascript
jQuery入门之层次选择器实例简析
2015/12/11 Javascript
jQuery实现鼠标经过购物车出现下拉框代码(推荐)
2016/07/21 Javascript
AngularJS中过滤器的使用与自定义实例代码
2016/09/17 Javascript
js原生跨域_用script标签的简单实现
2016/09/24 Javascript
CSS3 动画卡顿性能优化的完美解决方案
2018/09/20 Javascript
详解swiper在vue中的应用(以3.0为例)
2018/09/20 Javascript
vue+element模态框中新增模态框和删除功能
2019/06/11 Javascript
解决layui下拉框监听问题(监听不到值的变化)
2019/09/28 Javascript
解决vue-router 嵌套路由没反应的问题
2020/09/22 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
Python 实现一个颜色色值转换的小工具
2016/12/06 Python
Python使用random.shuffle()打乱列表顺序的方法
2018/11/08 Python
python3.7 使用pymssql往sqlserver插入数据的方法
2019/07/08 Python
Python定时从Mysql提取数据存入Redis的实现
2020/05/03 Python
只要五步 就可以用HTML5/CSS3快速制作便签贴特效(图)
2012/06/04 HTML / CSS
html5 datalist 选中option选项后的触发事件
2020/03/05 HTML / CSS
比利时网上药店: Drogisterij.net
2017/03/17 全球购物
世界上最大的罕见唱片、CD和音乐纪念品网上商店:991.com
2018/05/03 全球购物
Coggles美国/加拿大:高级国际时装零售商
2018/10/23 全球购物
ETO男装官方网店:ETO Jeans
2019/02/28 全球购物
企划主管岗位职责
2013/12/12 职场文书
奥巴马的演讲稿
2014/05/15 职场文书
关于读书的活动方案
2014/08/14 职场文书
2015年员工工作总结范文
2015/04/08 职场文书
MySQL外键约束(FOREIGN KEY)案例讲解
2021/08/23 MySQL
Win11自动黑屏怎么办 Win11自动黑屏设置教程
2022/07/15 数码科技