Vue使用Axios請(qǐng)求攔截器的案例詳解
Vue中Axios攔截器
在Vue項(xiàng)目中,Axios是一個(gè)非常流行的HTTP客戶端,用于發(fā)送請(qǐng)求和接收響應(yīng)。Axios攔截器是Axios的一個(gè)強(qiáng)大功能,它允許你在請(qǐng)求發(fā)送之前和響應(yīng)返回之后對(duì)請(qǐng)求和響應(yīng)進(jìn)行處理和攔截。通過(guò)攔截器,你可以添加請(qǐng)求頭、處理請(qǐng)求參數(shù)、處理錯(cuò)誤等。本文將結(jié)合實(shí)際案例,詳細(xì)介紹如何在Vue中使用Axios攔截器。
一、安裝Axios
首先,你需要在Vue3項(xiàng)目中安裝Axios。你可以使用npm或yarn等包管理工具進(jìn)行安裝。
npm install axios
或者
yarn add axios
二、創(chuàng)建Axios實(shí)例
在Vue3項(xiàng)目中,通常會(huì)在項(xiàng)目的某個(gè)地方創(chuàng)建一個(gè)Axios實(shí)例,并對(duì)其進(jìn)行配置。你可以將Axios實(shí)例放在一個(gè)單獨(dú)的文件中,例如src/axios.js
。
// src/axios.js import axios from 'axios'; // 創(chuàng)建Axios實(shí)例 const axiosInstance = axios.create({ baseURL: '// 你的基礎(chǔ)URL', // 設(shè)置請(qǐng)求的baseURL timeout: 5000, // 設(shè)置請(qǐng)求超時(shí)時(shí)間 }); // 導(dǎo)出Axios實(shí)例 export default axiosInstance;
在上面的代碼中,我們使用axios.create方法創(chuàng)建了一個(gè)Axios實(shí)例,并傳遞了一些配置選項(xiàng),例如baseURL和timeout。
三、設(shè)置請(qǐng)求攔截器
請(qǐng)求攔截器允許你在請(qǐng)求發(fā)送之前對(duì)請(qǐng)求進(jìn)行處理。你可以在Axios實(shí)例中使用interceptors.request.use方法來(lái)添加請(qǐng)求攔截器。
// src/axios.js import axios from 'axios'; // 創(chuàng)建Axios實(shí)例 const axiosInstance = axios.create({ baseURL: '// 你的基礎(chǔ)URL', timeout: 5000, }); // 添加請(qǐng)求攔截器 axiosInstance.interceptors.request.use( (config) => { // 在發(fā)送請(qǐng)求之前做些什么 // 例如,添加請(qǐng)求頭 const token = localStorage.getItem('token'); if (token) { config.headers['Authorization'] = `Bearer ${token}`; } // 處理請(qǐng)求參數(shù) // config.params = { // ...config.params, // key: 'value', // }; return config; }, (error) => { // 對(duì)請(qǐng)求錯(cuò)誤做些什么 return Promise.reject(error); } ); // 導(dǎo)出Axios實(shí)例 export default axiosInstance;
在上面的代碼中,我們添加了一個(gè)請(qǐng)求攔截器。在攔截器中,我們檢查本地存儲(chǔ)中是否存在token,如果存在,則將其添加到請(qǐng)求頭中。你還可以對(duì)請(qǐng)求參數(shù)進(jìn)行處理,例如添加或修改參數(shù)。
四、設(shè)置響應(yīng)攔截器
響應(yīng)攔截器允許你在響應(yīng)返回之后對(duì)響應(yīng)進(jìn)行處理。你可以在Axios實(shí)例中使用interceptors.response.use
方法來(lái)添加響應(yīng)攔截器。
// src/axios.js import axios from 'axios'; // 創(chuàng)建Axios實(shí)例 const axiosInstance = axios.create({ baseURL: '// 你的基礎(chǔ)URL', timeout: 5000, }); // 添加請(qǐng)求攔截器(同上) // 添加響應(yīng)攔截器 axiosInstance.interceptors.response.use( (response) => { // 對(duì)響應(yīng)數(shù)據(jù)做些什么 // 例如,處理響應(yīng)數(shù)據(jù)格式 // response.data = { // ...response.data, // key: 'value', // }; return response; }, (error) => { // 對(duì)響應(yīng)錯(cuò)誤做些什么 const { response } = error; if (response) { // 判斷錯(cuò)誤狀態(tài)碼 if (response.status === 400) { // 請(qǐng)求錯(cuò)誤 } else if (response.status === 401) { // 未授權(quán),請(qǐng)重新登錄 } else if (response.status === 403) { // 拒絕訪問(wèn)(403) } return Promise.reject(response.data); } else { console.error('網(wǎng)絡(luò)連接異常,請(qǐng)稍后再試!'); } } ); // 導(dǎo)出Axios實(shí)例 export default axiosInstance;
在上面的代碼中,我們添加了一個(gè)響應(yīng)攔截器。在攔截器中,我們可以對(duì)響應(yīng)數(shù)據(jù)進(jìn)行處理,例如修改數(shù)據(jù)格式。我們還可以根據(jù)響應(yīng)的狀態(tài)碼來(lái)處理不同的錯(cuò)誤情況。
五、在Vue組件中使用Axios實(shí)例
現(xiàn)在,我們已經(jīng)在項(xiàng)目中創(chuàng)建了Axios實(shí)例,并添加了請(qǐng)求和響應(yīng)攔截器。接下來(lái),我們可以在Vue組件中使用這個(gè)Axios實(shí)例來(lái)發(fā)送請(qǐng)求。
<!-- src/components/YourComponent.vue --> <template> <div>數(shù)據(jù)展示</div> </template> <script> import axiosInstance from '../axios'; export default { name: 'YourComponent', mounted() { axiosInstance.get('/your-endpoint') .then(data => { console.log(data); }) .catch(error => { console.error('錯(cuò)誤:', error); }); }, }; </script>
在上面的代碼中,我們?cè)赩ue組件的mounted生命周期鉤子中使用了Axios實(shí)例來(lái)發(fā)送一個(gè)GET請(qǐng)求。請(qǐng)求成功后,我們將響應(yīng)數(shù)據(jù)打印到控制臺(tái)。如果請(qǐng)求失敗,我們將錯(cuò)誤信息打印到控制臺(tái)。
六、封裝請(qǐng)求方法
為了更方便地在項(xiàng)目中發(fā)送請(qǐng)求,我們可以將常用的請(qǐng)求方法封裝起來(lái)。例如,我們可以封裝GET和POST請(qǐng)求方法。
// src/api/axios.js import axios from 'axios'; // 創(chuàng)建Axios實(shí)例(同上) // 封裝GET請(qǐng)求方法 export function getRequest(url, params = {}) { return axiosInstance.get(url, { params }); } // 封裝POST請(qǐng)求方法 export function postRequest(url, data = {}) { return axiosInstance.post(url, data); }
現(xiàn)在,我們可以在Vue組件中使用封裝好的請(qǐng)求方法來(lái)發(fā)送請(qǐng)求。
<!-- src/components/YourComponent.vue --> <template> <div>數(shù)據(jù)展示</div> </template> <script> import { getRequest, postRequest } from '../api/axios'; export default { name: 'YourComponent', mounted() { // 使用GET請(qǐng)求方法 getRequest('/your-get-endpoint', { param1: 'value1' }) .then(data => { console.log('GET請(qǐng)求響應(yīng):', data); }) .catch(error => { console.error('GET請(qǐng)求錯(cuò)誤:', error); }); // 使用POST請(qǐng)求方法 postRequest('/your-post-endpoint', { key: 'value' }) .then(data => { console.log('POST請(qǐng)求響應(yīng):', data); }) .catch(error => { console.error('POST請(qǐng)求錯(cuò)誤:', error); }); }, }; </script>
七、統(tǒng)一管理API接口
在項(xiàng)目中,我們可能會(huì)有很多API接口。為了方便管理和維護(hù),我們可以將這些接口統(tǒng)一管理起來(lái)。例如,我們可以在src/api
目錄下創(chuàng)建一個(gè)api.js
文件,并在其中定義所有的API接口。
// src/api/api.js import { getRequest, postRequest } from './axios'; // 定義用戶相關(guān)API接口 export class UserApi { static async login(params) { return postRequest('/login', params); } static async register(params) { return postRequest('/register', params); } static async getUserInfo(params) { return getRequest('/userInfo', params); } } // 定義書籍相關(guān)API接口 export class BookApi { static async getBookList(params) { return getRequest('/bookList', params); } }
現(xiàn)在,我們可以在Vue組件中使用統(tǒng)一管理好的API接口來(lái)發(fā)送請(qǐng)求。
<!-- src/components/YourComponent.vue --> <template> <div> <button @click="handleLogin">登錄</button> </div> </template> <script> import { UserApi } from '../api/api'; export default { name: 'YourComponent', methods: { async handleLogin() { const params = { username: 'admin', password: '123456', }; try { const response = await UserApi.login(params); console.log('登錄成功:', response); } catch (error) { console.error('登錄失敗:', error); } }, }, }; </script>
拓展:Vue配置axios響應(yīng)攔截器
一個(gè)項(xiàng)目會(huì)發(fā)送很多請(qǐng)求到后端,每個(gè)請(qǐng)求都有如下的響應(yīng)
不想每個(gè)請(qǐng)求都去判斷里面的status,那么可以使用axios的響應(yīng)攔截器,對(duì)服務(wù)端返回的一些相同點(diǎn)做統(tǒng)一的處理
比如說(shuō)如果有報(bào)錯(cuò),就統(tǒng)一彈出這么個(gè)錯(cuò)誤信息
在src目錄下新建utils目錄里新建api.js(名字隨你自己)
原先彈出錯(cuò)誤信息,可以直接只用
this.$message.error('請(qǐng)輸入正確格式')
但是現(xiàn)在是在js文件里,需要額外單獨(dú)引入
配置axios響應(yīng)攔截器(其實(shí)也可以配置請(qǐng)求攔截器,就是在所有請(qǐng)求里添加什么什么什么,比如說(shuō)統(tǒng)一添加請(qǐng)求頭)
這里先介紹響應(yīng)攔截器
import axios from 'axios' import { Message } from 'element-ui'; import router from '../router'//導(dǎo)入文件夾,自動(dòng)會(huì)去找里面的index.js const instances = axios.create({ baseURL: 'http://localhost', }); //響應(yīng)攔截器 instances.interceptors.response.use(success=>{//這個(gè)success指的是調(diào)用接口成功 console.log('響應(yīng)攔截器,chenggong') },error=>{//接口根本沒(méi)有調(diào)用到或者服務(wù)器掛了,各種原因 console.log('響應(yīng)攔截器,shibai',error) Message.error({message:error}) }); // //可以在所有請(qǐng)求前添加前置路徑 // let base=''; // //封裝請(qǐng)求并導(dǎo)出 // export const postRequest=(url,params)=>{ // return axios({ // method:'post', // url:'${base}${url}', // data:params // }) // } export default instances;
記得在main.js引入
引入的即為utils.api.js里
導(dǎo)出的
下面第一張圖用的是反引號(hào),注意
到此這篇關(guān)于Vue使用Axios請(qǐng)求攔截器的案例詳解的文章就介紹到這了,更多相關(guān)Vue Axios請(qǐng)求攔截器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue項(xiàng)目之webpack打包靜態(tài)資源路徑不準(zhǔn)確的問(wèn)題
這篇文章主要介紹了vue項(xiàng)目之webpack打包靜態(tài)資源路徑不準(zhǔn)確的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04詳解vue-flickity的fullScreen功能實(shí)現(xiàn)
這篇文章主要介紹了詳解vue-flickity的fullScreen功能實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Vue導(dǎo)出頁(yè)面為PDF格式的實(shí)現(xiàn)思路
這篇文章主要介紹了Vue導(dǎo)出頁(yè)面為PDF格式的實(shí)現(xiàn)思路,其實(shí)思路也很簡(jiǎn)單,就是將頁(yè)面轉(zhuǎn)換成圖片格式.然后通過(guò)圖片的base64碼.生成PDF..感興趣的朋友跟隨腳本之家小編一起看看吧2018-07-07Vue利用AJAX請(qǐng)求獲取XML文件數(shù)據(jù)的操作方法
在現(xiàn)代Web開發(fā)中,從前端框架到后端API的交互是必不可少的一部分,Vue.js作為一個(gè)輕量級(jí)且功能強(qiáng)大的前端框架,支持多種方式與服務(wù)器通信,從而獲取或發(fā)送數(shù)據(jù),本文將詳細(xì)介紹如何在Vue.js項(xiàng)目中使用AJAX請(qǐng)求來(lái)獲取XML格式的數(shù)據(jù),需要的朋友可以參考下2024-09-09SpringBoot+Vue項(xiàng)目線上買菜系統(tǒng)源碼展示
本線上買菜系統(tǒng)采用的數(shù)據(jù)庫(kù)是Mysql,使用springboot框架開發(fā)。在設(shè)計(jì)過(guò)程中,充分保證了系統(tǒng)代碼的良好可讀性、實(shí)用性、易擴(kuò)展性、通用性、便于后期維護(hù)、操作方便以及頁(yè)面簡(jiǎn)潔等特點(diǎn),需要的朋友可以參考下2022-08-08vue3.2?reactive函數(shù)問(wèn)題小結(jié)
reactive用來(lái)包裝一個(gè)對(duì)象,使其每個(gè)對(duì)象屬性都具有響應(yīng)性(也就是深層次響應(yīng)式),這篇文章主要介紹了vue3.2?reactive函數(shù)注意點(diǎn)及問(wèn)題小結(jié),需要的朋友可以參考下2022-12-12Vue ElementUi同時(shí)校驗(yàn)多個(gè)表單(巧用new promise)
這篇文章主要介紹了巧用new promise實(shí)現(xiàn)Vue ElementUi同時(shí)校驗(yàn)多個(gè)表單功能,實(shí)現(xiàn)的方法有很多種,本文給大家?guī)?lái)的是一種比較完美的方案,需要的朋友可以參考下2018-06-06