Vue封裝Axios請求和攔截器的步驟
PS:本文代碼在vue-cli3構建的基礎vue項目之上進行編寫:vue create my-project
axios 是一個基于 promise 的 http 庫,可以用在瀏覽器和 node.js 中, 也是vue官方推薦使用的http庫。
axios很好用,其中之一就是它的攔截器十分強大,我們可以為請求和響應設置攔截器,比如請求攔截器可以在每個請求里加上token,做了統(tǒng)一處理后維護起來也方便,響應攔截器可以在接收到響應后先做一層操作,如根據(jù)狀態(tài)碼判斷登錄狀態(tài)、授權。
之前初學的時候,經(jīng)常將axios數(shù)據(jù)請求寫在各組件方法內(nèi),但實踐證明,如果項目接口變動要修改url地址等參數(shù)會比較為麻煩,不易維護,于是需要對axios進行封裝并將接口統(tǒng)一管理。
當然在最之前,我們需要安裝axios,使用命令 npm install axios --save 即可。
一、新建函數(shù)文件
在 src目錄 下新建一個 axios目錄,然后在里面創(chuàng)建 axios-request.js 和 axios-api.js 兩個文件,
其中 aixos-request.js 用于對axios進行封裝,axios-api.js 用于接口的統(tǒng)一管理。
二、對axios進行封裝
axios-request.js代碼如下:
import axios from "axios";
import { Message } from "element-ui";
// 創(chuàng)建一個axios實例
const axiosService = axios.create({
baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
timeout: 5000 // 設置超時時間為5s
});
// request攔截器 ==> 對請求參數(shù)進行處理
axiosService.interceptors.request.use(
config => {
// 可以在發(fā)送請求之前做些事情
// 比如請求參數(shù)的處理、在headers中攜帶token等等
return config;
}, error => {
// 處理請求錯誤
console.log(error); // for debug
Promise.reject(error);
}
);
// respone攔截器 ==> 對響應做處理
axiosService.interceptors.response.use(
response => {
const res = response.data;
// 如果自定義的返回碼不等于200, 就返回一個錯誤
if (res.code !== 200) {
return Promise.reject(new Error(res.message || "Error"))
} else {
return res;
}
}, error => {
// 判斷error的status代碼,并將對應的信息告知用戶
let text = "";
let err = JSON.parse(JSON.stringify(error));
if (err.response.status) {
switch (error.response.status) {
case 400:
text = "請求錯誤(400),請重新申請";
break;
case 401:
text = "登錄錯誤(401),請重新登錄";
return this.$router.replace("/login");
case 403:
text = "拒絕訪問(403)";
break;
case 404:
text = "請求出錯(404)";
break;
case 408:
text = "請求超時(408)";
break;
case 500:
text = "服務器錯誤(500),請重啟軟件或切換功能頁!";
break;
case 501:
text = "服務未實現(xiàn)(501)";
break;
case 502:
text = "網(wǎng)絡錯誤(502)";
break;
case 503:
text = "服務不可用(503)";
break;
case 504:
text = "網(wǎng)絡超時(504)";
break;
case 505:
text = "HTTP版本不受支持(505)";
break;
default:
text = "網(wǎng)絡連接出錯";
}
} else {
text = "連接服務器失敗,請退出重試!";
}
Message({
showClose: true,
message: text,
type: "error"
});
return Promise.reject(error);
}
);
// 將寫好的axios實例暴露出去
export default axiosService;
三、對接口進行統(tǒng)一管理
axios-api.js代碼如下:
import axiosService from "./axios-request"; // 從axios-request.js內(nèi)引入axiosService
// 下面是POST形式
export const userLogin = data => {
return axiosService({
url: "/xxxx/user/xxxx", // 根據(jù)實際接口地址來寫
method: "post",
data
});
};
// 下面是GET形式
export const userInfo = params => {
return axiosService({
url: "/xxxx/user/xxxx", // 根據(jù)實際接口地址來寫
method: "get",
params
});
};
這里要注意下,post參數(shù)放在data內(nèi),get參數(shù)放在params內(nèi)!
四、在組件內(nèi)使用寫好的接口
在組件中使用:
下面是模擬的一個登錄接口,代碼不太嚴謹,僅演示大致用法:
<script>
import {userLogin} from "@/axios/axios-api"; // 引入登錄接口函數(shù)
export default {
name: "login",
components: {},
methods: {
async login() {
let username = this.username;
let password = this.password;
let params = {
username: username,
password: password
};
if (!username || !password) {
alert("賬號或密碼不能為空");
} else {
if (username.length < 51 && password.length < 51) {
let res = await userLogin(params);
console.log(res);
} else {
alert("賬號或密碼輸入字符不能超過50位");
}
}
}
}
};
</script>
上面的代碼中我們用了 async await,是ES7新出的特性,具體用法可以Google或者到MDN上查看。
五、總結
當然也可以不將接口統(tǒng)一管理,而只用axios封裝,然后在組件內(nèi)寫異步請求函數(shù)。
以上是個人在之前學習的時候,所用的封裝方式,如有錯誤之處歡迎留言指正。
以上就是Vue封裝Axios請求和攔截器的步驟的詳細內(nèi)容,更多關于Vue封裝的資料請關注腳本之家其它相關文章!
相關文章
Vue數(shù)據(jù)監(jiān)聽器watch和watchEffect的使用
今天我們來學習一下watch監(jiān)聽器和它的好兄弟watchEffect監(jiān)聽器。這個相對來說比較簡單,用的不是很多,當然了,根據(jù)自己的項目情況自行決定使用,希望對大家有所幫助2023-02-02
Vue的transition-group與Virtual Dom Diff算法的使用
這篇文章主要介紹了Vue的transition-group與Virtual Dom Diff算法的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12
vuex實現(xiàn)像調(diào)用模板方法一樣調(diào)用Mutations方法
今天小編就為大家分享一篇vuex實現(xiàn)像調(diào)用模板方法一樣調(diào)用Mutations方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
vue?this.$router.go(-1);返回時如何帶參數(shù)
這篇文章主要介紹了vue?this.$router.go(-1);返回時如何帶參數(shù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
Element中Upload組件上傳功能實現(xiàn)(圖片和文件的默認上傳及自定義上傳)
這篇文章主要介紹了Element中Upload組件上傳功能實現(xiàn)包括圖片和文件的默認上傳及自定義上傳,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01
Vue3結合TypeScript項目開發(fā)實戰(zhàn)記錄
聽說有的公司已經(jīng)開始用vue3了 趕緊打開B站學一下,下面這篇文章主要給大家介紹了關于Vue3結合TypeScript項目開發(fā)實戰(zhàn)的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2021-09-09

