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 相关文章推荐
JQuery扩展插件Validate 1 基本使用方法并打包下载
Sep 05 Javascript
只需20行代码就可以写出CSS覆盖率测试脚本
Apr 24 Javascript
JQuery筛选器全系列介绍
Aug 27 Javascript
Javascript delete 引用类型对象
Nov 01 Javascript
js整数字符串转换为金额类型数据(示例代码)
Dec 26 Javascript
jquery实现简易的移动端验证表单
Nov 08 Javascript
javascript入门教程基础篇
Nov 16 Javascript
浅析JS运动
Dec 28 Javascript
详解如何提高 webpack 构建 Vue 项目的速度
Jul 03 Javascript
layui框架table 数据表格的方法级渲染详解
Aug 19 Javascript
npm 常用命令详解(小结)
Jan 17 Javascript
微信小程序上传图片并等比列压缩到指定大小的实例代码
Oct 24 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中抽象类和接口的概念以及区别
2013/06/27 PHP
php实例化一个类的具体方法
2019/09/19 PHP
从零开始学习jQuery (二) 万能的选择器
2010/10/01 Javascript
最佳JS代码编写的14条技巧
2011/01/09 Javascript
一些常用的JavaScript函数(json)附详细说明
2011/05/25 Javascript
javascript常用函数归纳整理
2014/10/31 Javascript
JavaScript设计模式之建造者模式介绍
2014/12/28 Javascript
JavaScript实现Fly Bird小游戏
2016/12/15 Javascript
Vue实现底部侧边工具栏的实例代码
2018/09/03 Javascript
微信小程序制作表格的方法
2019/02/14 Javascript
vue + any-touch实现一个iscroll 实现拖拽和滑动动画效果
2019/04/08 Javascript
微信小程序自定义tabBar的踩坑实践记录
2020/11/06 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
2021/01/06 Javascript
[55:39]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第二场 1月19日
2021/03/11 DOTA
Python简单格式化时间的方法【strftime函数】
2016/09/18 Python
python3+PyQt5自定义视图详解
2018/04/24 Python
python钉钉机器人运维脚本监控实例
2019/02/20 Python
PyQt5 加载图片和文本文件的实例
2019/06/14 Python
Pytorch模型转onnx模型实例
2020/01/15 Python
python爬虫学习笔记之pyquery模块基本用法详解
2020/04/09 Python
python递归函数用法详解
2020/10/26 Python
Django filter动态过滤与排序实现过程解析
2020/11/26 Python
python爬虫中抓取指数的实例讲解
2020/12/01 Python
Html5踩坑记之mandMobile使用小记
2020/04/02 HTML / CSS
香蕉共和国Banana Republic官网:美国GAP旗下偏贵族风格服饰品牌
2016/11/21 全球购物
厂办主管岗位职责范本
2014/02/28 职场文书
创建文明城市标语
2014/06/16 职场文书
教师四风对照检查材料思想汇报
2014/09/17 职场文书
2014年党小组工作总结
2014/12/20 职场文书
教师年度考核个人总结
2015/02/12 职场文书
校本研修个人总结
2015/02/28 职场文书
2019年公司快递收发管理制度模板
2019/11/20 职场文书
如何利用React实现图片识别App
2022/02/18 Javascript
Spring Security使用单点登录的权限功能
2022/04/03 Java/Android
Redis基本数据类型String常用操作命令
2022/06/01 Redis
错误码NET::ERR_CERT_DATE_INVALID证书已过期解决方法?
2022/07/07 数码科技