vue+ts封裝axios網(wǎng)絡(luò)請求封裝方式
更新時間:2025年12月06日 08:41:19 作者:仰望星空下的自己
文章介紹了如何使用Vue和TypeScript封裝Axios網(wǎng)絡(luò)請求,并提供了一個示例文件`request.ts`,展示了如何封裝各種請求,此外,還提到了路由管理文件和狀態(tài)碼處理文件的結(jié)構(gòu)
vue+ts封裝axios網(wǎng)絡(luò)請求封裝
request.ts 文件
import axios from 'axios';
import router from '@/router';
import StatusInit from '@/utils/status/StatusInit' // 狀態(tài)碼的策略模式
const CancelToken: any = axios.CancelToken; // axios 的取消請求
let token = localStorage.getItem('token');
const service = axios.create({
baseURL: '', // 可以不需要
timeout: 5000, // 超時時間
withCredentials: true,
headers: {
'version': '1.0.1', // 接口的版本號
'Authorization': 'Bearer ' + token, // 向后臺發(fā)送的token
get: {
'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
},
post: {
'Content-Type': 'application/json;charset=utf-8'
}
},
validateStatus () {
return true;
},
});
// 防止重復(fù)提交 利用axios的cancelToken
let pending: any[] = []; // 聲明一個數(shù)組用于存儲每個ajax請求的取消函數(shù)和ajax標(biāo)識
/**
* 取消重復(fù)請求
* @param config
* @param f
*/
const removePending: any = (config: any, f: any) => {
const flgUrl = config.url;
if ( pending.indexOf(flgUrl) !== -1 ) {
if ( f ) {
f('取消重復(fù)請求');
} else {
pending.splice(pending.indexOf( flgUrl ), 1); // 刪除記錄
}
} else {
if ( f ) {
pending.push( flgUrl );
}
}
}
/**
* 請求攔截器
*/
service.interceptors.request.use(
(config: any) => {
if ( !config.neverCancel ) {
// 生成canalToken
config.cancelToken = new CancelToken((c: any) => {
removePending(config, c);
});
}
// 添加請求頭以及其他邏輯處理
return config;
},
(error: any) => {
Promise.resolve(error);
}
);
/**
* 響應(yīng)攔截器
*/
service.interceptors.response.use(
(response: any) => {
removePending( response.config );
const res = response.data;
// 后端status錯誤判斷
if ( res.status === 200 ) {
let status = new StatusInit();
status.init(res.status, res.msg, res);
return Promise.resolve(res);
} else {
// 錯誤狀態(tài)碼處理
return Promise.reject(res);
}
},
(error: any) => {
// Http錯誤狀態(tài)碼處理
return Promise.reject(error);
}
);
export default service;
各種請求的分裝
import request from '../request/request';
/**
* 封裝get請求
* @param {string} url 請求連接
* @param {Object} params 請求參數(shù)
* @param {Object} header 請求需要設(shè)置的header頭
*/
export const get = (url: string, params: object, header: {}) => {
return request({
url: url,
method: 'get',
params: params,
headers: header
});
}
/**
* 封裝post請求
* @param {string} url 請求連接
* @param {Object} params 請求參數(shù)
* @param {Object} header 請求的header頭
*/
export const post = (url: string, params: object, header: {}) => {
return request({
url: url,
method: 'post',
data: params,
headers: header
});
}
/**
* 封裝put請求
* @param {string} url 請求連接
* @param {Object} params 請求參數(shù)
* @param {Object} header 請求設(shè)置的header頭
*/
export const put = (url: string, params: object, header: {}) => {
return request({
url: url,
method: 'put',
data: params,
headers: header
});
}
/**
* 封裝delete請求
* @param {string} url 請求連接
* @param {Object} params 請求參數(shù)
* @param {Object} header 請求設(shè)置的header頭
*/
export const del = (url: string, params: object, header: {}) => {
return request({
url: url,
method: 'delete',
data: params,
headers: header
});
}
路由管理文件 在這里可以寫自己的路由信息
eg:
登錄的路由 const login = ‘login’;
在module.exports 里面添加 login: login
const baseUrl = ''; //域名
const index = 'index'; // 首頁路由
export default {
baseUrl: baseUrl,
index: index
}
請求以及接口路由調(diào)用文件
import {get, post, put, del} from '../utils/request/apiRequest'; // 引入各種請求方法
import api from './apiList'; // 引入請求api路由
/**
* 首頁接口請求
*/
const index = () => {
let url = api.baseUrl + api.index;
return get(url, {}, {});
}
export default {
index: index
}
StatusInit.ts
import Status200 from '@/utils/status/statusCode/Status200';
import Status401 from '@/utils/status/statusCode/Status401';
import Status from '@/utils/status/status';
export default class StatusInit
{
public init(status: number, msg: string, res: object)
{
let state: Status = null;
switch ( status ) {
case 200:
state = new Status200();
break;
case 401:
state = new Status401();
break;
}
state.status(status, msg, res);
}
}
status.ts
export default interface Status {
status(state: number, msg: string, res: object): any;
}
Status200.ts(其他狀態(tài)文件類似)
import Status from '@/utils/status/status';
import Message from '@/utils/Message/Message';
export default class Status200 implements Status
{
public status(state: number, msg: string, res: object): any {
let Message = new Message();
Message.msg(msg, 'success', 1500, true, true, 100);
return Promise.resolve(res);
}
}
總結(jié)
以上經(jīng)測可用,可能會有忘記添加的文件。
這些僅為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue使用路由鉤子攔截器beforeEach和afterEach監(jiān)聽路由
這篇文章主要介紹了Vue使用路由鉤子攔截器beforeEach和afterEach監(jiān)聽路由,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11
Vue3中使用vue3-print-nb實現(xiàn)打印功能
這篇文章主要為大家詳細(xì)介紹了Vue3中如何使用vue3-print-nb實現(xiàn)打印功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起參考一下2025-02-02
Vue應(yīng)用中504錯誤(Gateway timeout)的原因與解決方法
在Vue前端應(yīng)用中遇到504代理錯誤通常是由于請求在到達(dá)服務(wù)器之前超時,504錯誤表示網(wǎng)關(guān)超時,可能由后端服務(wù)響應(yīng)慢、網(wǎng)絡(luò)問題、代理配置錯誤、請求負(fù)載過大、前端請求超時設(shè)置不當(dāng)、服務(wù)器資源不足或第三方服務(wù)問題引起2024-09-09

