淺談 Axios 在 Vue 專案中的使用
阿新 • • 發佈:2019-01-07
介紹
Axios 是一個基於 promise 的 HTTP 庫,可以用在瀏覽器和 node.js 中。
特性
它主要有如下特性:
瀏覽器端發起XMLHttpRequests請求
Node端發起http請求
支援Promise API
攔截請求和響應
轉化請求和響應(資料)
取消請求
自動轉化json資料
客戶端支援抵禦XSRF(跨站請求偽造)
安裝
Vue專案中使用如下命令安裝
npm install axios --save
使用
Axios擁有諸多配置項,由於專案中請求數量很多,因此考慮將其封裝成公共API,api.js呼叫一個配置檔案config.js
api.js
import axios from 'axios'
import config from './config.js'
class API {
// POST
post(params) {
config.data = params.data
return axios.post(params.url,config.data,config)
}
// 此處可以封裝其他方法
}
export default API
config.js
export default {
method: 'post',
// 基礎url字首
baseURL: 'your request url',
// 請求頭資訊
headers: {
'Content-Type' :'application/json;charset=UTF-8'
},
// 引數
data: {},
// 設定超時時間
timeout: 10000,
// 攜帶憑證
withCredentials: false,
// 返回資料型別
responseType: 'json'
}
getBrandsByHot:function () {
let params = {
url:'/company/list',
data:{
cond:{},
limit:9,
order_word: "attention_rate",
order_direction: -1 ,
page:1
}
}
api.post(params).then(response => {
this.hot_brand = response.data
}).catch({});
}
由於IE9不支援Promise,因此需要在專案入口main.js中打個補丁,否則無法發出請求
import 'babel-polyfill'
如上,已經能在IE9+上發起網路請求,但是IE9上有個問題:response.data為undefined,因此需要對返回的資料針對不同瀏覽器進行處理,在API.js中加入如下攔截器
// 響應攔截
axios.interceptors.response.use(function (response) {
var data
// IE9時response.data是undefined,因此需要使用response.request.responseText(Stringify後的字串)
if(response.data == undefined){
data = response.request.responseText
} else{
data = response.data
}
// 判斷data不是Object時,解析成Object
if(!(data instanceof Object)){
data = JSON.parse(data)
}
return data
}, function (error) {
return Promise.reject(error)
});
進階使用
結合promise 統一請求進一步封裝成vue外掛 可實現登入、攔截、登出等功能,以及利用axios的http攔截器攔截請求和響應
api.js
export default function fetch (options) {
return new Promise((resolve, reject) => {
const instance = axios.create({
baseURL: SERVER_BASE_URL,
headers: {},
transformResponse: [function (data) {
}]
})
instance.interceptors.request.use(
config => {
return config
},
err => {
return Promise.reject(err)
})
instance.interceptors.response.use(
response => {
return response
},
error => {
return Promise.reject({code:1000}) // 返回介面返回的錯誤資訊
})
//請求處理
instance(options)
.then((res) => {
resolve(res.data)
return false
})
.catch((error) => {
reject(error)
})
})
}
然後我們可以吧請求放到一個檔案統一維護(相同的請求再也不用寫多次了)
interface.js
const IS_GUEST = params => {
return fetch({
url: '/sys/role/getRoleIdByUserId',
method: 'get',
params: params
})
}
const RESET_PASSWORD = params => {
return fetch({
url: '/person/resetPswByMobile',
method: 'get',
params: params
})
}
export default apiList={
IS_GUEST,
RESET_PASSWORD
}
再來把封裝的axio作為vue的外掛使用
index.js
//匯入模組
import apiList from './interface'
const install = function(Vue) {
if (install.installed) return
install.installed = true
Object.defineProperties(Vue.prototype, {
$api: {
get() {
return apiList
}
}
})
}
export default {
install
}
接下來我們vue中可以這樣使用axios
main.js先註冊外掛
import api from './index'
Vue.use(api)
然後可以在任何檔案愉快的使用起來 就像這樣
this.$api.RESET_PASSWORD().then(res=>{
// ...
})