使用jsonp去抓取数据的时候,数据的接口有host和referer的显示,咱们的api请求被拒绝(500错误),必需要修改header,可是前端不能直接修改request header,咱们采起后端接口代理的方法去解决使用express,这样前端去请求接口的时候不是直接请求服务器的url,而是请求咱们本身的server端,让local server再去请求QQ服务端前端
原理:在封装的请求数据函数getDiscList中不是直接请求url,而是请求express服务器端地址,再让咱们的local server去请求服务端,使用nodejs请求服务器端,用到一个axios库,在浏览器端发送的是xmlhttprequest请求,在nodejs中发送的是http请求。node
const express = require('express')
const axios = require('axios')
const app = express()
var apiRoutes = express.Router()
app.use('/api', apiRoutes)
在devServer{}中添加webpack
before(app) {ios
app.get('/api/getDiscList', (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 // 经过req从浏览器端发过来的一堆参数(platform,sin,ein等)透传给qq的服务端 }).then((response)=>{ // qq服务端的响应数据,再经过res将响应数据输出到浏览器端 res.json(response.data) }).catch((error)=>{ console.log(error) }) }) }
以后,回到recommend.js中获取数据,请求的是本地express服务器的api数据(ajax请求),(本地express的数据是上边经过axios得到的)不是Jsonp数据了,返回的是axios的数据web
export function getDiscList() { //调用这个方法时请求url时请求的不是QQ服务端,而是本身的server端,请求的是请求express服务器端地 址'/api/getDiscList' //而,咱们去请求api时,在webpack.dev.conf.js中,让local server再去请求QQ服务端 //这样作的结果就是,不是前端直接去请求QQ服务端,而是经过中介本身的local server去请求QQ服务端 // const url = 'https://c.y.qq.com/splcloud/fcgi-bin/fcg_get_diss_by_tag.fcg' const url = '/api/getDiscList' //此时这个url并非咱们一般意义上的接口而是express服务器端地址 const data = Object.assign({}, commonParams, { platform: 'yqq', hostUin: 0, sin: 0, ein: 29, sortId: 5, needNewCode: 0, categoryId: 10000000, rnd: Math.random(), format: 'json' // 使用的时axios,因此format使用的是json,不是jsonp }) return axios.get(url, { params: data }).then((res) => { return Promise.resolve(res.data) }) }