|
| 1 | +/* eslint-disable @typescript-eslint/no-explicit-any */ |
| 2 | +// index.ts |
| 3 | +import { notification } from 'antd' |
| 4 | +import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios' |
| 5 | +import axios from 'axios' |
| 6 | + |
| 7 | +type Result<T> = { |
| 8 | + code: number |
| 9 | + message: string |
| 10 | + result: T |
| 11 | +} |
| 12 | + |
| 13 | +// 导出Request,可以用来自定义传递配置来创建实例 |
| 14 | +export class Request { |
| 15 | + // axios 实例 |
| 16 | + instance: AxiosInstance |
| 17 | + // 基础配置,url和超时时间 |
| 18 | + baseConfig: AxiosRequestConfig = { baseURL: '/api', timeout: 60000 } |
| 19 | + |
| 20 | + constructor(config: AxiosRequestConfig) { |
| 21 | + // 使用axios.create创建axios实例,配置为基础配置和我们传递进来的配置 |
| 22 | + this.instance = axios.create(Object.assign(this.baseConfig, config)) |
| 23 | + |
| 24 | + this.instance.interceptors.request.use(this.requestBefore, this.requestReject) |
| 25 | + |
| 26 | + this.instance.interceptors.response.use(this.requestResolove, this.requestReject) |
| 27 | + } |
| 28 | + |
| 29 | + /** 请求前处理 - 处理 config */ |
| 30 | + requestBefore(config: any) { |
| 31 | + // 一般会请求拦截里面加token,用于后端的验证 |
| 32 | + const token = localStorage.getItem('token') as string |
| 33 | + if (token) { |
| 34 | + config.headers.Authorization = token |
| 35 | + } |
| 36 | + |
| 37 | + return config |
| 38 | + } |
| 39 | + |
| 40 | + /** 请求成功 - 响应处理 */ |
| 41 | + requestResolove(res: AxiosResponse) { |
| 42 | + console.log(res) |
| 43 | + // 直接返回res,当然你也可以只返回res.data |
| 44 | + // 系统如果有自定义code也可以在这里处理 |
| 45 | + return Promise.resolve(res) |
| 46 | + } |
| 47 | + |
| 48 | + /** 请求错误 - 响应处理 */ |
| 49 | + requestReject(err: { |
| 50 | + response: { |
| 51 | + statusText: string |
| 52 | + data: any |
| 53 | + status: any |
| 54 | + } |
| 55 | + }) { |
| 56 | + // 这里用来处理http常见错误,进行全局提示 |
| 57 | + let message = '' |
| 58 | + switch (err.response.status) { |
| 59 | + case 400: |
| 60 | + message = '请求错误(400)' |
| 61 | + break |
| 62 | + case 401: |
| 63 | + message = '未授权,请重新登录(401)' |
| 64 | + // 这里可以做清空storage并跳转到登录页的操作 |
| 65 | + break |
| 66 | + case 403: |
| 67 | + message = '拒绝访问(403)' |
| 68 | + break |
| 69 | + case 404: |
| 70 | + message = '请求出错(404)' |
| 71 | + break |
| 72 | + case 408: |
| 73 | + message = '请求超时(408)' |
| 74 | + break |
| 75 | + case 500: |
| 76 | + message = '服务器错误(500)' |
| 77 | + break |
| 78 | + case 501: |
| 79 | + message = '服务未实现(501)' |
| 80 | + break |
| 81 | + case 502: |
| 82 | + message = '网络错误(502)' |
| 83 | + break |
| 84 | + case 503: |
| 85 | + message = '服务不可用(503)' |
| 86 | + break |
| 87 | + case 504: |
| 88 | + message = '网络超时(504)' |
| 89 | + break |
| 90 | + case 505: |
| 91 | + message = 'HTTP版本不受支持(505)' |
| 92 | + break |
| 93 | + default: |
| 94 | + message = `连接出错(${err.response.status})!` |
| 95 | + } |
| 96 | + // 这里错误消息可以使用全局弹框展示出来 |
| 97 | + // 比如element plus 可以使用 ElMessage |
| 98 | + notification.open({ |
| 99 | + message: message, |
| 100 | + key: 'error', |
| 101 | + type: 'error', |
| 102 | + description: '请检查网络或联系管理员!', |
| 103 | + }) |
| 104 | + // 这里是AxiosError类型,所以一般我们只reject我们需要的响应即可 |
| 105 | + return Promise.reject(err?.response.statusText) |
| 106 | + } |
| 107 | + |
| 108 | + /** 定义请求方法 */ |
| 109 | + public request(config: AxiosRequestConfig): Promise<AxiosResponse> { |
| 110 | + return this.instance.request(config) |
| 111 | + } |
| 112 | + |
| 113 | + /** Get 请求 */ |
| 114 | + public get<R = any>(url: string, config?: AxiosRequestConfig): Promise<AxiosResponse<Result<R>>> { |
| 115 | + return this.instance.get(url, config) |
| 116 | + } |
| 117 | + |
| 118 | + /** Post 请求 */ |
| 119 | + public post<P = any, R = any>( |
| 120 | + url: string, |
| 121 | + data?: P, |
| 122 | + config?: AxiosRequestConfig, |
| 123 | + ): Promise<AxiosResponse<Result<R>>> { |
| 124 | + return this.instance.post(url, data, config) |
| 125 | + } |
| 126 | + |
| 127 | + /** Put 请求 */ |
| 128 | + public put<P = any, R = any>( |
| 129 | + url: string, |
| 130 | + data?: P, |
| 131 | + config?: AxiosRequestConfig, |
| 132 | + ): Promise<AxiosResponse<Result<R>>> { |
| 133 | + return this.instance.put(url, data, config) |
| 134 | + } |
| 135 | + |
| 136 | + /** delete 请求 */ |
| 137 | + public delete<R = any>( |
| 138 | + url: string, |
| 139 | + config?: AxiosRequestConfig, |
| 140 | + ): Promise<AxiosResponse<Result<R>>> { |
| 141 | + return this.instance.delete(url, config) |
| 142 | + } |
| 143 | +} |
| 144 | + |
| 145 | +// 默认导出Request实例 |
| 146 | +export default new Request({}) |
0 commit comments