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