Axios in Vue
簡介
- 在大型專案中,有許多發送API請求的函式,散落在專案各處,七零八落
- 可以把API請求集中管理並模組化,提高可維護性
設置方法
1. 在src資料夾內,新增services資料夾
- 新增 index.js 檔案
- 使用 axios.create 創建實體
- 可以設定baseURL和Authorization這些每個請求共用的變數
./service/index.jsimport 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.jsimport 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