安装axios
npm install axios
统一封装axios请求 index.ts
import axios, { AxiosInstance, AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'
import type { Result } from '@/common/interface/Result';
import { RequestEnums } from '@/common/enums/httpEnums';
const URL: string = '/api';
const config = {
baseURL: URL as string,
timeout: RequestEnums.TIMEOUT as number,
withCredentials: true
}
class RequestHttp {
service: AxiosInstance;
public constructor(config: AxiosRequestConfig) {
this.service = axios.create(config);
this.service.interceptors.request.use(
(config: AxiosRequestConfig) => {
const token = localStorage.getItem('token') || '';
return {
...config,
headers: {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
'token': token,
}
}
},
(error: AxiosError) => {
Promise.reject(error)
}
)
this.service.interceptors.response.use(
(response: AxiosResponse) => {
const { data, config } = response;
if (data.code === RequestEnums.OVERDUE) {
localStorage.setItem('token', '');
return Promise.reject(data);
}
if (data.code && data.code !== RequestEnums.SUCCESS) {
return Promise.reject(data)
}
return data;
},
(error: AxiosError) => {
const { response } = error;
if (response) {
this.handleCode(response.status)
}
if (!window.navigator.onLine) {
}
}
)
}
handleCode(code: number): void {
switch (code) {
case 401:
break;
default:
break;
}
}
get<T>(url: string, params?: object): Promise<Result<T>> {
return this.service.get(url, { params });
}
post<T>(url: string, params?: object): Promise<Result<T>> {
return this.service.post(url, params);
}
put<T>(url: string, params?: object): Promise<Result<T>> {
return this.service.put(url, params);
}
delete<T>(url: string, params?: object): Promise<Result<T>> {
return this.service.delete(url, { params });
}
}
export default new RequestHttp(config);
Result.ts
export interface Result<T = any> {
code: number;
message: string;
datas: T;
}
httpEnums.ts
export enum RequestEnums {
TIMEOUT = 20000,
FAIL = 500,
SUCCESS = 200,
OVERDUE = 304,
}
使用
import axios from '@/utils/http/axios/index'
import { LoginReqForm } from '@/api/params/LoginParams';
import { Result } from '@/common/interface/Result';
export const loginApi = (params: LoginReqForm) => {
return axios.post<Result>('/login.do', params);
}
import { ref, reactive, defineComponent } from "vue";
import { LoginReqForm } from "@/api/params/LoginParams";
const loginForm: LoginReqForm = reactive({
username: "1011",
password: "123456",
});
const Login = async () => {
const data = await loginApi(loginForm);
console.log(data);
};
跨域 vite.config.ts
export default ({ mode }) => {
return defineConfig({
server: {
host: '0.0.0.0',
port: 3000,
open: true,
proxy: {
"/api": {
target: env.VITE_BASE_API,
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '/')
}
}
},
})
}