Axios 是一個基於 promise 的 HTTP 庫,能夠用在瀏覽器和 node.js 中。javascript
它具備如下特徵:html
返回一個以給定值解析後的Promise對象。但若是這個值是個thenable(即帶有then方法),返回的promise會「跟隨」這個thenable的對象,採用它的最終狀態(指resolved/rejected/pending/settled);若是傳入的value自己就是promise對象,則該對象做爲Promise.resolve方法的返回值返回;不然以該值爲成功狀態返回promise對象。前端
正向代理 是一個位於客戶端和原始服務器(origin server)之間的服務器,爲了從原始服務器取得內容,客戶端向代理髮送一個請求並指定目標(原始服務器),而後代理向原始服務器轉交請求並將得到的內容返回給客戶端。客戶端必需要進行一些特別的設置才能使用正向代理。java
正向代理的做用:node
反向代理(Reverse Proxy)實際運行方式是指以代理服務器來接受internet上的鏈接請求,而後將請求轉發給內部網絡上的服務器,並將從服務器上獲得的結果返回給internet上請求鏈接的客戶端,此時代理服務器對外就表現爲一個服務器。webpack
反向代理的做用:ios
在正向代理中,proxy和client同屬於一個LAN,對server而言是透明的。web
在反向代理中,proxy和server同屬於一個LAN,對client而言是透明的。express
而實際上proxy在兩種代理中作的事都是代爲收發請求和響應,不過從結構上來看正好左右互換了一下,這種結構上的互換就導致後出現的那種代理方式叫作了反向代理。json
以一個get請求爲例
import {commonParams} from 'somewhere'
export function getSomeInfo() {
const url = 'api/getSomeInfo'
const data = Object.assign({}, commonParams, {
key1: value1,
key2: value2,
key3: value3,
...
})
return axios.get(url, {
params: data
}).then(res => {
return Promise.resolve(res.data)
})
}
複製代碼
proxyTable: {
'/api/getSomeInfo': {
target: 'https://xxxx', // 目標地址
changeOrigin: true, // 容許跨域
secure: false, // 若是是https接口,須要配置這個參數
bypass:function(req,res,proxyOptions){
req.headers.referer='https://xxxx'; // 請求referer
req.headers.host='xxx'; // 也能夠不寫,請求會自動發送host
},
pathRewrite: {
'^/api/getSomeInfo': ''
}
}
}
複製代碼
_getSomeInfo () {
getSomeInfo().then((res) => {
if (res.status === ERR_OK) {
console.log(res.data) // 這樣就取到數據了
}
})
}
複製代碼
這樣的話在開發模式下就已經能夠實現跨域請求,可是這樣設置在打包上線後並不能實現跨域。(由於有的項目前端代碼和後臺代碼並不在一個服務器上),因此還有一種方法能夠解決上線後跨域的問題。
在webpack.dev.conf.js中
const axios = require('axios') // 使用axios
const app = express()
const apiRoutes = express.Router() // 定義一個API的routes
app.use('/api', apiRoutes)
devServer: {
// 在發送請求以前僞造refer,host
before(app) {
app.get('/getSomeInfo', function (req, res) {
var url = 'https://xxxx' // 目標地址
axios.get(url, {
headers: {
referer: 'https://xxxx', // 僞造referer
host: 'xxx' // 僞造host
},
// params是即將與請求一塊兒發送的url參數,無格式對象/URLSearchParams對象
params: req.query
}).then((response) => {
res.json(response.data)
}).catch((e) => {
console.log(e)
})
})
}
}
複製代碼
而後調用api發送請求的方式和第一點相同。至此,就成功實現了利用反向代理實現跨域請求。