您好,登录后才能下订单哦!
在现代的前端开发中,网络请求是不可或缺的一部分。Vue.js 流行的前端框架,通常需要与后端服务器进行数据交互。为了简化网络请求的处理,开发者通常会使用 axios
这个基于 Promise 的 HTTP 客户端库。本文将详细介绍如何在 Vue 项目中封装 axios
,以便更好地管理网络请求。
axios
?在 Vue 项目中直接使用 axios
是可行的,但随着项目的复杂度增加,直接使用 axios
可能会导致以下问题:
axios
的代码可能不够直观,难以理解。通过封装 axios
,我们可以解决上述问题,使代码更加简洁、可维护性更高。
axios
首先,我们需要在项目中安装 axios
。可以通过 npm 或 yarn 来安装:
npm install axios
或者
yarn add axios
request.js
文件在 src
目录下创建一个 utils
文件夹,并在其中创建一个 request.js
文件。这个文件将用于封装 axios
。
src/
├── utils/
│ └── request.js
在 request.js
中,我们可以对 axios
进行基本的封装。以下是一个简单的封装示例:
import axios from 'axios';
// 创建 axios 实例
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API, // 设置基础 URL
timeout: 5000, // 请求超时时间
});
// 请求拦截器
service.interceptors.request.use(
(config) => {
// 在发送请求之前做些什么
// 例如:添加请求头、处理 token 等
const token = localStorage.getItem('token');
if (token) {
config.headers['Authorization'] = `Bearer ${token}`;
}
return config;
},
(error) => {
// 对请求错误做些什么
return Promise.reject(error);
}
);
// 响应拦截器
service.interceptors.response.use(
(response) => {
// 对响应数据做些什么
const res = response.data;
if (res.code !== 200) {
// 处理业务逻辑错误
return Promise.reject(new Error(res.message || 'Error'));
} else {
return res;
}
},
(error) => {
// 对响应错误做些什么
return Promise.reject(error);
}
);
export default service;
axios.create
:创建一个 axios
实例,可以设置一些默认配置,如 baseURL
和 timeout
。request
方法在项目中,我们可以通过导入 request.js
来使用封装好的 axios
实例。以下是一个简单的示例:
import request from '@/utils/request';
export function fetchUserInfo(userId) {
return request({
url: `/user/${userId}`,
method: 'get',
});
}
在 Vue 组件中,我们可以这样使用:
import { fetchUserInfo } from '@/api/user';
export default {
data() {
return {
userInfo: null,
};
},
async created() {
try {
const res = await fetchUserInfo(1);
this.userInfo = res.data;
} catch (error) {
console.error('Failed to fetch user info:', error);
}
},
};
在实际开发中,网络请求可能会遇到各种错误,例如网络超时、服务器错误等。为了更好地处理这些错误,我们可以在 request.js
中进行统一的错误处理。
// 响应拦截器
service.interceptors.response.use(
(response) => {
const res = response.data;
if (res.code !== 200) {
// 处理业务逻辑错误
return Promise.reject(new Error(res.message || 'Error'));
} else {
return res;
}
},
(error) => {
// 对响应错误做些什么
if (error.response) {
// 服务器返回了错误状态码
switch (error.response.status) {
case 401:
// 未授权,跳转到登录页面
router.push('/login');
break;
case 404:
// 资源未找到
break;
case 500:
// 服务器内部错误
break;
default:
break;
}
} else if (error.request) {
// 请求已发出,但没有收到响应
console.error('No response received:', error.request);
} else {
// 其他错误
console.error('Error:', error.message);
}
return Promise.reject(error);
}
);
error.response
:服务器返回了错误状态码,例如 401、404、500 等。error.request
:请求已发出,但没有收到响应,可能是网络问题。在某些情况下,我们希望在请求发送时显示 loading 效果,请求结束后隐藏 loading。可以通过在请求拦截器和响应拦截器中添加 loading 的逻辑来实现。
import { Loading } from 'element-ui';
let loadingInstance;
// 请求拦截器
service.interceptors.request.use(
(config) => {
// 显示 loading
loadingInstance = Loading.service({ fullscreen: true });
return config;
},
(error) => {
// 隐藏 loading
loadingInstance.close();
return Promise.reject(error);
}
);
// 响应拦截器
service.interceptors.response.use(
(response) => {
// 隐藏 loading
loadingInstance.close();
return response;
},
(error) => {
// 隐藏 loading
loadingInstance.close();
return Promise.reject(error);
}
);
Loading.service
:使用 Element UI 的 Loading
组件来显示 loading 效果。loadingInstance.close()
:在请求结束后关闭 loading 效果。在某些情况下,我们可能需要取消正在进行的请求。例如,当用户快速切换页面时,之前的请求可能已经不再需要。axios
提供了取消请求的功能。
import axios from 'axios';
const CancelToken = axios.CancelToken;
let cancel;
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API,
timeout: 5000,
});
// 请求拦截器
service.interceptors.request.use(
(config) => {
// 添加取消请求的功能
config.cancelToken = new CancelToken((c) => {
cancel = c;
});
return config;
},
(error) => {
return Promise.reject(error);
}
);
// 取消请求的函数
export function cancelRequest() {
cancel && cancel();
}
CancelToken
:axios
提供的取消请求的功能。cancel
:保存取消请求的函数,可以在需要时调用。在某些情况下,请求可能会因为网络问题而失败。为了提高请求的成功率,我们可以添加请求重试的功能。
import axios from 'axios';
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API,
timeout: 5000,
});
// 请求拦截器
service.interceptors.request.use(
(config) => {
return config;
},
(error) => {
return Promise.reject(error);
}
);
// 响应拦截器
service.interceptors.response.use(
(response) => {
return response;
},
async (error) => {
const originalRequest = error.config;
if (error.response.status === 500 && !originalRequest._retry) {
originalRequest._retry = true;
// 重试请求
return service(originalRequest);
}
return Promise.reject(error);
}
);
originalRequest._retry
:标记请求是否已经重试过,避免无限重试。service(originalRequest)
:重新发送请求。通过封装 axios
,我们可以使 Vue 项目中的网络请求更加简洁、可维护性更高。本文介绍了如何对 axios
进行基本封装、处理错误、添加全局 loading 效果、请求取消功能以及请求重试功能。希望这些内容能够帮助你在 Vue 项目中更好地管理网络请求。
以下是 request.js
的完整代码示例:
import axios from 'axios';
import { Loading } from 'element-ui';
import router from '@/router';
const CancelToken = axios.CancelToken;
let cancel;
let loadingInstance;
// 创建 axios 实例
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API,
timeout: 5000,
});
// 请求拦截器
service.interceptors.request.use(
(config) => {
// 显示 loading
loadingInstance = Loading.service({ fullscreen: true });
// 添加取消请求的功能
config.cancelToken = new CancelToken((c) => {
cancel = c;
});
// 添加请求头
const token = localStorage.getItem('token');
if (token) {
config.headers['Authorization'] = `Bearer ${token}`;
}
return config;
},
(error) => {
// 隐藏 loading
loadingInstance.close();
return Promise.reject(error);
}
);
// 响应拦截器
service.interceptors.response.use(
(response) => {
// 隐藏 loading
loadingInstance.close();
const res = response.data;
if (res.code !== 200) {
// 处理业务逻辑错误
return Promise.reject(new Error(res.message || 'Error'));
} else {
return res;
}
},
async (error) => {
// 隐藏 loading
loadingInstance.close();
if (error.response) {
// 服务器返回了错误状态码
switch (error.response.status) {
case 401:
// 未授权,跳转到登录页面
router.push('/login');
break;
case 404:
// 资源未找到
break;
case 500:
// 服务器内部错误
const originalRequest = error.config;
if (!originalRequest._retry) {
originalRequest._retry = true;
// 重试请求
return service(originalRequest);
}
break;
default:
break;
}
} else if (error.request) {
// 请求已发出,但没有收到响应
console.error('No response received:', error.request);
} else {
// 其他错误
console.error('Error:', error.message);
}
return Promise.reject(error);
}
);
// 取消请求的函数
export function cancelRequest() {
cancel && cancel();
}
export default service;
通过本文的介绍,你应该已经掌握了如何在 Vue 项目中封装 axios
来管理网络请求。封装 axios
不仅可以提高代码的可维护性,还能使网络请求的处理更加灵活和高效。希望这些内容能够帮助你在实际项目中更好地使用 axios
。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。