結(jié)合axios對項(xiàng)目中的api請求進(jìn)行封裝操作
痛點(diǎn):
1. 后端對全部請求的url進(jìn)行了調(diào)整。
2.后端要求給所有的請求頭部添加一個token, 或者對請求添加其他全局處理。
3.請求代碼直接寫在每個頁面里, 看起來代碼臃腫,不夠簡練,太難管理。
4.看到請求代碼, 不明白該請求是干嘛的,語義化不夠明顯。 ...
上面列舉的是一些常見的問題,如果沒對api進(jìn)行封裝,當(dāng)請求比較多的時候,修改起來欲哭無淚,解決這些問題可以進(jìn)行以下操作
1.對axios進(jìn)行二次封裝
2.對全部api請求也進(jìn)行封裝
如下是對axios 進(jìn)行二次封裝, 文件名是 network/index.js:
import axios from "axios";
import Cookies from "js-cookie";
// 設(shè)置超時時間
const myAxios = axios.create({
timeout: 5000
});
// 跳轉(zhuǎn)登錄頁面
function nav2Login() {
location.href = '/xxxx/login'
}
// 添加一個請求攔截器
myAxios.interceptors.request.use(
function(config) {
// Do something before request is sent
config.headers["token"] = Cookies.get("token") || "";
return config;
},
function(error) {
// Do something with request error
return Promise.reject(error);
}
);
// 添加一個響應(yīng)攔截器
myAxios.interceptors.response.use(
function(response) {
// Do something with response data
// 這里只是以200 401為示例, 其他狀態(tài)碼可以根據(jù)需要自行添加
if (response.status === 200) {
return response.data;
} else if (response.status === 401) {
nav2Login()
return Promise.reject();
} else {
return {
status: 0,
message: response.data.message
};
}
},
function(error) {
// Do something with response error
return Promise.reject(error);
}
);
export default myAxios;
下面是對全部的api進(jìn)行了封裝,文件名是 network/api.js:
import axios from "./index.js";
const API = {
userList: 'api/user/all', // 用戶列表
cityList: 'api/city/all', // 城市列表
};
function Axios(obj) {
return axios({
...obj
}).catch(e => {
// 這里兜住error, 從而不影響后續(xù)代碼執(zhí)行,避免出現(xiàn)白屏
return {
status: 0,
message: "網(wǎng)絡(luò)請求異常"
};
});
}
// 給函數(shù)命名的時候 盡量語義化
function getUserList(params) {
return Axios({
url: API.userList,
method: "post",
params
});
}
function getCityList(params) {
return Axios({
url: API.cityList,
method: "get",
params
});
}
export default {
getUserList,
getCityList,
}
可以把這些請求掛載在一個全局的變量上, 以Vue為例:
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import api from "@/network/api.js";
Vue.prototype.$api = api;
new Vue({
router,
render: h => h(App)
}).$mount('#app')
Vue項(xiàng)目中使用方法如下:
this.$api.getUserList(obj).then(res => {
// 處理res
}).catch(err){
// 處理 err
}
// 或者使用async await
async getUserList () {
try {
const res = await this.$api.getUserList(obj)
// 處理res
} catch (err) {
// 處理err
}
}
補(bǔ)充知識:Vue項(xiàng)目中對axios進(jìn)行封裝以及api接口請求
對axios進(jìn)行封裝:
/* 定義一個ajax請求函數(shù),并且其返回值: promise對象(異步返回的數(shù)據(jù)是: response.data) */
import axios from 'axios';
export default function ajax (url, data={}, type='GET') {
return new Promise(function (resolve, reject) {
// 執(zhí)行異步ajax請求
let promise
if (type === 'GET') {
// 準(zhǔn)備url query參數(shù)數(shù)據(jù),
let dataStr = '' //數(shù)據(jù)拼接字符串
Object.keys(data).forEach(key => {
dataStr += key + '=' + data[key] + '&'
})
if (dataStr !== '') {
dataStr = dataStr.substring(0, dataStr.lastIndexOf('&'))
url = url + '?' + dataStr
}
// 發(fā)送get請求
promise = axios.get(url)
} else {
// 發(fā)送post請求
promise = axios.post(url, data)
}
promise.then(function (response) {
// 成功了調(diào)用resolve()
resolve(response.data)
}).catch(function (error) {
//失敗了調(diào)用reject()
reject(error)
})
})
}
以上這篇結(jié)合axios對項(xiàng)目中的api請求進(jìn)行封裝操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決vue2.0 element-ui中el-upload的before-upload方法返回false時submit(
這篇文章主要介紹了vue2.0 element-ui中el-upload的before-upload方法返回false時submit()不生效的解決方法,這里需要主要項(xiàng)目中用的element-ui是V1.4.3,感興趣的朋友參考下吧2018-08-08
使用ElementUI el-upload實(shí)現(xiàn)一次性上傳多個文件
在日常的前端開發(fā)中,文件上傳是一個非常常見的需求,尤其是在用戶需要一次性上傳多個文件的場景下,ElementUI作為一款非常優(yōu)秀的Vue.js 2.0組件庫,為我們提供了豐富的UI組件,本文介紹了如何使用ElementUI el-upload實(shí)現(xiàn)一次性上傳多個文件,需要的朋友可以參考下2024-08-08
Nuxt封裝@nuxtjs/axios請求后端數(shù)據(jù)方式
這篇文章主要介紹了Nuxt封裝@nuxtjs/axios請求后端數(shù)據(jù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10
Vuejs學(xué)習(xí)筆記之使用指令v-model完成表單的數(shù)據(jù)雙向綁定
表單類控件承載了一個網(wǎng)頁數(shù)據(jù)的錄入與交互,本章將介紹如何使用指令v-model完成表單的數(shù)據(jù)雙向綁定功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值。感興趣的朋友跟隨小編一起看看吧2019-04-04
Vue列表循環(huán)從指定下標(biāo)開始的多種解決方案
這篇文章主要介紹了Vue列表循環(huán)從指定下標(biāo)開始的多種方案,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04
詳解.vue文件中監(jiān)聽input輸入事件(oninput)
本篇文章主要介紹了詳解.vue文件中監(jiān)聽input輸入事件(oninput),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09
Vue+Microapp實(shí)現(xiàn)微前端的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何實(shí)現(xiàn)以vite+vue3+Microapp為主應(yīng)用,以vue2+element為子應(yīng)用的微前端,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧2023-06-06
VUE 實(shí)現(xiàn)element upload上傳圖片到阿里云
這篇文章主要介紹了VUE 實(shí)現(xiàn)element upload上傳圖片到阿里云,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08

