Axios in Vue
簡介
- 在大型專案中,有許多發送API請求的函式,散落在專案各處,七零八落
- 可以把API請求集中管理並模組化,提高可維護性
設置方法
1. 在src資料夾內,新增services資料夾
- 新增 index.js 檔案
- 使用 axios.create 創建實體
- 可以設定baseURL和Authorization這些每個請求共用的變數
./service/index.js
import axios from 'axios'
const request = axios.create({
baseURL: import.meta.env.VITE_API_URL,
timeout: 1000,
withCredentials: true
})
export default request
2. 配置攔截器 ( Interceptors )
- 在發出請求之前:可以先行確認資料是否正確,再發出或停止請求
- 接收回應之前:可以先對回傳的資料做預先處理
- 如果成功,繼續執行後面的程式碼
- 如果失敗,在攔截器中直接處理錯誤
// 請求攔截器
request.interceptors.request.use(config => {
// 在發送請求之前做些什麼
// 如果有token,就把token帶入請求之中
const token = store.state.token;
token && (config.headers.Authorization = token);
return config;
}, error => {
// 對請求錯誤做些什麼
return Promise.reject(error);
});
// 響應攔截器
request.interceptors.response.use(response => {
// 對響應數據做些什麼
if (response.status === 200) {
return response.data;
} else {
const error = new Error(`HTTP status code not OK: ${response.status}`);
return Promise.reject(error);
}
}, error => {
// 對響應錯誤做些什麼
if(err.response){
switch (err.response.status) {
case 401:
const errCode = err.response.data ? err.response.data.rtnCode : ''
// 沒有操作權限,登出
if (errCode == 'COMMON-0001') {
logout()
}
break
}
}
return Promise.reject(error);
});
3. 開始使用創建的axios實例
- 可以依照API功能分類,在services資料夾內創建其他檔案
- 例如創建api資料夾,所有發出API請求相關的檔案都放在這裡面
- export 要使用的函式
./services/api/auth.js
import request from '../../index.'
// 登入
const postUserLogin = (param = {})=> {
return $axios.post(`/api/login`, param)
}
// 取得登入者資訊
const postGetUserInfo = (param = {})=> {
return $axios.post(`/api/userinfo`, param)
}
export {postUserLogin, postGetUserInfo}
4. 在要使用的地方引入
// loginPage.vue
<script setup>
import { ref } from 'vue';
import { getUserInfo } from '../service/client/auth';
const data = ref(null);
const param = { username: 'test', password: 'test' };
const fetchData = async () => {
try {
const response = await getUserInfo(param);
data.value = response.data;
} catch (error) {
console.error('An error occurred:', error);
}
};
fetchData();
</script>
參考資料
# Vue # Axios