`axios xhr http` 庫創建網路請求。 提供了豐富的配置,這裡講一講我在工作中通常用到的基本配置方法。 因為我在工作中用 進行開發,所以以下代碼預設的環境是 。 創建一個 axios 實例 為什麼要創建一個 實例,而不是在 對象上進行配置呢?是因為我們會應對複雜的使用場景,多個實例便於管 ...
axios
是目前流行的Promise網路請求庫,在瀏覽器端他通過 xhr
方式創建ajax請求。在node環境下,通過 http
庫創建網路請求。
axios
提供了豐富的配置,這裡講一講我在工作中通常用到的基本配置方法。
因為我在工作中用 vue
進行開發,所以以下代碼預設的環境是 vue-cli
。
創建一個 axios 實例
為什麼要創建一個 axios
實例,而不是在 axios
對象上進行配置呢?是因為我們會應對複雜的使用場景,多個實例便於管理。
const isDev = process.env.NODE_ENV === 'development';
const instance = axios.create({
// baseURL是在proxyTable中會轉發的配置,通過環境變數的判斷,可以在開發和生產環境使用不同的url進行請求
baseURL: isDev ? '/fakeapi' : '/api',
timeout: 5000,
validateStatus(status) {
// 一般來說,http status為200-300之間時,均判定為請求通過,你可以在這裡修改這個配置(不建議修改)
return status === 200
},
headers: {
// 定義 post 請求編碼格式
post: {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
}
}
});
處理請求參數
雖然對請求設置了編碼格式,但是還是需要進一步設置具體的編碼格式,比如我想進行一些特殊的設置。
qs.stringify
這裡的參數請參考這篇文章 qs.js - 更好的處理url參數
import Qs from 'qs';
instance.interceptors.request.use(config => {
// 也可以在這裡給請求添加token之類的欄位
config.data = Qs.stringify(config.data, {arrayFormat: 'repeat', allowDots: true});
return config;
}, err => {
return Promise.reject(err);
});
處理返回值
import httpErrorHandler from './httpErrorHandler.js';
instance.interceptors.response.use(function(data) {
// 這裡可以對返回數據進行處理,比如驗證code是否為1等
return data.data;
}, httpErrorHandler)
httpErrorHandler.js
代碼
# httpErrorHandler.js
export default (error) => {
if (!error.response) {
return Promise.reject({
msg: '網路連接超時',
error
});
};
let msg = '';
const status = error.response.status;
switch (status) {
case 400:
msg = '錯誤的請求參數';
break;
case 401:
msg = '沒有該操作許可權';
break;
case 403:
msg = '請登錄';
break;
case 404:
msg = '錯誤的請求地址';
break;
case 500:
case 501:
case 502:
case 503:
case 504:
msg = '伺服器錯誤';
break;
default:
msg = '未知錯誤' + status;
}
return Promise.reject({
msg,
error
});
}
封裝 get 方法
和 jquery.ajax
不同,axios
的get方式需要通過 prarms
而不是 data
參數傳遞:
/**
* 封裝後的axios get方法
*
* @param {string} url 請求路徑
* @param {object} option 請求參數
* @param {object} [config] 特殊配置項(選填)
* @returns
*/
export function get(url, option, config = {}) {
return instance.get(url, { params: option }, config)
}
// 調用get
get('http://baidu.com', {
a: 1,
b: 2
})
.then(...)
.catch(...)
post 方式
post請求方式則要簡單一些,不需要使用 prarms
參數
/**
* 封裝後的axios post方法
*
* @param {string} url 請求路徑
* @param {object} option 請求參數
* @param {object} [config] 特殊配置項(選填)
* @returns
*/
export function get(url, option, config = {}) {
return instance.get(url, option, config)
}
// 調用post
post('http://baidu.com', {
a: 1,
b: 2
})
.then(...)
.catch(...)
upload 文件
上傳文件需要使用不同的header設置和編碼方式,所以需要創建一個單獨的實例
const uploadInstance = axios.create({
baseURL: isDev ? '/fakeapi' : '/api',
timeout: 15000,
headers: {
// 發送文件需要的編碼格式
'Content-Type': 'multipart/form-data'
}
});
/**
* 封裝後的axios upload方法
*
* @param {string} url 請求路徑
* @param {object} option 請求參數
* @param {object} [config] 特殊配置項(選填)
* @returns
*/
export function get(url, option, config = {}) {
let formdata = new FormData();
Object.keys(option).forEach(key=>{
formdata.append(key, option[key])
})
return uploadInstance.post(url, formdata, config)
}
# 使用上傳
let data = {
a: 1,
image: input.files[0],
}
let config = {
onUploadProgress(progressEvent) {
// 展示上傳進度等
}
}
upload('http://baidu.com', data, config)