Vue封裝Axios請(qǐng)求和攔截器的步驟
PS:本文代碼在vue-cli3構(gòu)建的基礎(chǔ)vue項(xiàng)目之上進(jìn)行編寫(xiě):vue create my-project
axios 是一個(gè)基于 promise 的 http 庫(kù),可以用在瀏覽器和 node.js 中, 也是vue官方推薦使用的http庫(kù)。
axios很好用,其中之一就是它的攔截器十分強(qiáng)大,我們可以為請(qǐng)求和響應(yīng)設(shè)置攔截器,比如請(qǐng)求攔截器可以在每個(gè)請(qǐng)求里加上token,做了統(tǒng)一處理后維護(hù)起來(lái)也方便,響應(yīng)攔截器可以在接收到響應(yīng)后先做一層操作,如根據(jù)狀態(tài)碼判斷登錄狀態(tài)、授權(quán)。
之前初學(xué)的時(shí)候,經(jīng)常將axios數(shù)據(jù)請(qǐng)求寫(xiě)在各組件方法內(nèi),但實(shí)踐證明,如果項(xiàng)目接口變動(dòng)要修改url地址等參數(shù)會(huì)比較為麻煩,不易維護(hù),于是需要對(duì)axios進(jìn)行封裝并將接口統(tǒng)一管理。
當(dāng)然在最之前,我們需要安裝axios,使用命令 npm install axios --save 即可。
一、新建函數(shù)文件
在 src目錄 下新建一個(gè) axios目錄,然后在里面創(chuàng)建 axios-request.js 和 axios-api.js 兩個(gè)文件,其中 aixos-request.js 用于對(duì)axios進(jìn)行封裝,axios-api.js 用于接口的統(tǒng)一管理。
二、對(duì)axios進(jìn)行封裝
axios-request.js代碼如下:
import axios from 'axios';import { Message } from 'element-ui';// 創(chuàng)建一個(gè)axios實(shí)例const axiosService = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url timeout: 5000 // 設(shè)置超時(shí)時(shí)間為5s});// request攔截器 ==> 對(duì)請(qǐng)求參數(shù)進(jìn)行處理axiosService.interceptors.request.use( config => { // 可以在發(fā)送請(qǐng)求之前做些事情 // 比如請(qǐng)求參數(shù)的處理、在headers中攜帶token等等 return config; }, error => { // 處理請(qǐng)求錯(cuò)誤 console.log(error); // for debug Promise.reject(error); });// respone攔截器 ==> 對(duì)響應(yīng)做處理axiosService.interceptors.response.use( response => { const res = response.data; // 如果自定義的返回碼不等于200, 就返回一個(gè)錯(cuò)誤 if (res.code !== 200) { return Promise.reject(new Error(res.message || 'Error')) } else { return res; } }, error => { // 判斷error的status代碼,并將對(duì)應(yīng)的信息告知用戶 let text = ''; let err = JSON.parse(JSON.stringify(error)); if (err.response.status) { switch (error.response.status) { case 400: text = '請(qǐng)求錯(cuò)誤(400),請(qǐng)重新申請(qǐng)'; break; case 401: text = '登錄錯(cuò)誤(401),請(qǐng)重新登錄'; return this.$router.replace('/login'); case 403: text = '拒絕訪問(wèn)(403)'; break; case 404: text = '請(qǐng)求出錯(cuò)(404)'; break; case 408: text = '請(qǐng)求超時(shí)(408)'; break; case 500: text = '服務(wù)器錯(cuò)誤(500),請(qǐng)重啟軟件或切換功能頁(yè)!'; break; case 501: text = '服務(wù)未實(shí)現(xiàn)(501)'; break; case 502: text = '網(wǎng)絡(luò)錯(cuò)誤(502)'; break; case 503: text = '服務(wù)不可用(503)'; break; case 504: text = '網(wǎng)絡(luò)超時(shí)(504)'; break; case 505: text = 'HTTP版本不受支持(505)'; break; default: text = '網(wǎng)絡(luò)連接出錯(cuò)'; } } else { text = '連接服務(wù)器失敗,請(qǐng)退出重試!'; } Message({ showClose: true, message: text, type: 'error' }); return Promise.reject(error); });// 將寫(xiě)好的axios實(shí)例暴露出去export default axiosService;
三、對(duì)接口進(jìn)行統(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ù)實(shí)際接口地址來(lái)寫(xiě) method: 'post', data });};// 下面是GET形式export const userInfo = params => { return axiosService({ url: '/xxxx/user/xxxx', // 根據(jù)實(shí)際接口地址來(lái)寫(xiě) method: 'get', params });};
這里要注意下,post參數(shù)放在data內(nèi),get參數(shù)放在params內(nèi)!
四、在組件內(nèi)使用寫(xiě)好的接口
在組件中使用:
下面是模擬的一個(gè)登錄接口,代碼不太嚴(yán)謹(jǐn),僅演示大致用法:
<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('賬號(hào)或密碼不能為空'); } else { if (username.length < 51 && password.length < 51) { let res = await userLogin(params); console.log(res); } else { alert('賬號(hào)或密碼輸入字符不能超過(guò)50位'); } } } }};</script>
上面的代碼中我們用了 async await,是ES7新出的特性,具體用法可以Google或者到MDN上查看。
五、總結(jié)
當(dāng)然也可以不將接口統(tǒng)一管理,而只用axios封裝,然后在組件內(nèi)寫(xiě)異步請(qǐng)求函數(shù)。以上是個(gè)人在之前學(xué)習(xí)的時(shí)候,所用的封裝方式,如有錯(cuò)誤之處歡迎留言指正。
以上就是Vue封裝Axios請(qǐng)求和攔截器的步驟的詳細(xì)內(nèi)容,更多關(guān)于Vue封裝的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. python裝飾器三種裝飾模式的簡(jiǎn)單分析2. JavaScript Reduce使用詳解3. Python實(shí)現(xiàn)迪杰斯特拉算法過(guò)程解析4. 詳解Python模塊化編程與裝飾器5. Spring security 自定義過(guò)濾器實(shí)現(xiàn)Json參數(shù)傳遞并兼容表單參數(shù)(實(shí)例代碼)6. JavaScript中的AOP編程的基本實(shí)現(xiàn)7. 淺談JavaScript中等號(hào)、雙等號(hào)、 三等號(hào)的區(qū)別8. 詳解java中static關(guān)鍵詞的作用9. Python如何進(jìn)行時(shí)間處理10. python使用ctypes庫(kù)調(diào)用DLL動(dòng)態(tài)鏈接庫(kù)
