2023-03-28 21:32:54 +08:00
|
|
|
|
import { buildURL } from '../helpers/buildURL';
|
2023-04-06 22:59:49 +08:00
|
|
|
|
import { combineURL } from '../helpers/combineURL';
|
2023-04-21 18:09:32 +08:00
|
|
|
|
import { CancelToken } from '../request/cancel';
|
|
|
|
|
import { AxiosTransformer } from '../request/transformData';
|
2023-03-23 20:09:00 +08:00
|
|
|
|
import {
|
|
|
|
|
AxiosAdapter,
|
2023-03-28 20:35:40 +08:00
|
|
|
|
AxiosAdapterRequestMethod,
|
2023-04-18 23:08:49 +08:00
|
|
|
|
AxiosAdapterPlatformTask,
|
2023-03-28 20:35:40 +08:00
|
|
|
|
AxiosAdapterRequestConfig,
|
2023-04-09 21:01:43 +08:00
|
|
|
|
AxiosAdapterResponseData,
|
2023-04-22 16:12:32 +08:00
|
|
|
|
} from '../adpater/createAdapter';
|
2023-04-17 19:27:44 +08:00
|
|
|
|
import InterceptorManager, { Interceptor } from './InterceptorManager';
|
2023-04-09 21:01:43 +08:00
|
|
|
|
import { mergeConfig } from './mergeConfig';
|
2023-04-23 23:05:30 +08:00
|
|
|
|
import AxiosDomain, { AxiosDomainRequestHandler } from './AxiosDomain';
|
2023-03-23 20:09:00 +08:00
|
|
|
|
|
2023-04-18 23:08:49 +08:00
|
|
|
|
/**
|
|
|
|
|
* 请求方法
|
|
|
|
|
*/
|
2023-03-28 20:35:40 +08:00
|
|
|
|
export type AxiosRequestMethod =
|
|
|
|
|
| AxiosAdapterRequestMethod
|
2023-03-23 20:09:00 +08:00
|
|
|
|
| 'options'
|
|
|
|
|
| 'get'
|
|
|
|
|
| 'head'
|
|
|
|
|
| 'post'
|
|
|
|
|
| 'put'
|
2023-04-14 18:16:39 +08:00
|
|
|
|
| 'patch'
|
2023-03-23 20:09:00 +08:00
|
|
|
|
| 'delete'
|
|
|
|
|
| 'trace'
|
|
|
|
|
| 'connect';
|
|
|
|
|
|
2023-04-18 23:08:49 +08:00
|
|
|
|
/**
|
|
|
|
|
* 请求头
|
|
|
|
|
*/
|
2023-03-28 20:35:40 +08:00
|
|
|
|
export interface AxiosRequestHeaders extends AnyObject {
|
2023-04-06 15:16:12 +08:00
|
|
|
|
/**
|
|
|
|
|
* 通用请求头
|
|
|
|
|
*/
|
2023-04-05 09:15:05 +08:00
|
|
|
|
common?: AnyObject;
|
2023-04-06 15:16:12 +08:00
|
|
|
|
/**
|
|
|
|
|
* options 请求头
|
|
|
|
|
*/
|
2023-03-28 20:35:40 +08:00
|
|
|
|
options?: AnyObject;
|
2023-04-06 15:16:12 +08:00
|
|
|
|
/**
|
|
|
|
|
* get 请求头
|
|
|
|
|
*/
|
2023-03-28 20:35:40 +08:00
|
|
|
|
get?: AnyObject;
|
2023-04-06 15:16:12 +08:00
|
|
|
|
/**
|
|
|
|
|
* head 请求头
|
|
|
|
|
*/
|
2023-03-28 20:35:40 +08:00
|
|
|
|
head?: AnyObject;
|
2023-04-06 15:16:12 +08:00
|
|
|
|
/**
|
|
|
|
|
* post 请求头
|
|
|
|
|
*/
|
2023-03-28 20:35:40 +08:00
|
|
|
|
post?: AnyObject;
|
2023-04-06 15:16:12 +08:00
|
|
|
|
/**
|
|
|
|
|
* put 请求头
|
|
|
|
|
*/
|
2023-03-28 20:35:40 +08:00
|
|
|
|
put?: AnyObject;
|
2023-04-06 15:16:12 +08:00
|
|
|
|
/**
|
|
|
|
|
* delete 请求头
|
|
|
|
|
*/
|
2023-03-28 20:35:40 +08:00
|
|
|
|
delete?: AnyObject;
|
2023-04-06 15:16:12 +08:00
|
|
|
|
/**
|
|
|
|
|
* trace 请求头
|
|
|
|
|
*/
|
2023-03-28 20:35:40 +08:00
|
|
|
|
trace?: AnyObject;
|
2023-04-06 15:16:12 +08:00
|
|
|
|
/**
|
|
|
|
|
* connect 请求头
|
|
|
|
|
*/
|
2023-03-28 20:35:40 +08:00
|
|
|
|
connect?: AnyObject;
|
|
|
|
|
}
|
2023-03-23 20:09:00 +08:00
|
|
|
|
|
2023-04-18 23:08:49 +08:00
|
|
|
|
/**
|
|
|
|
|
* 表单数据(上传会用到)
|
|
|
|
|
*/
|
2023-03-28 20:35:40 +08:00
|
|
|
|
export interface AxiosRequestFormData extends AnyObject {
|
2023-04-06 15:16:12 +08:00
|
|
|
|
/**
|
|
|
|
|
* 文件名
|
|
|
|
|
*/
|
|
|
|
|
name: string;
|
|
|
|
|
/**
|
|
|
|
|
* 文件路径
|
|
|
|
|
*/
|
2023-03-23 20:09:00 +08:00
|
|
|
|
filePath: string;
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-18 23:08:49 +08:00
|
|
|
|
/**
|
|
|
|
|
* 请求数据
|
|
|
|
|
*/
|
|
|
|
|
export type AxiosRequestData =
|
|
|
|
|
| string
|
|
|
|
|
| AnyObject
|
|
|
|
|
| ArrayBuffer
|
|
|
|
|
| AxiosRequestFormData;
|
2023-04-06 15:16:12 +08:00
|
|
|
|
|
2023-04-18 23:08:49 +08:00
|
|
|
|
/**
|
|
|
|
|
* 响应数据
|
|
|
|
|
*/
|
2023-04-20 13:56:17 +08:00
|
|
|
|
export type AxiosResponseData = number | AxiosAdapterResponseData;
|
2023-04-09 15:20:10 +08:00
|
|
|
|
|
2023-04-18 23:08:49 +08:00
|
|
|
|
/**
|
2023-04-20 21:49:26 +08:00
|
|
|
|
* 进度对象
|
2023-04-18 23:08:49 +08:00
|
|
|
|
*/
|
2023-04-20 21:49:26 +08:00
|
|
|
|
export interface AxiosProgressEvent extends AnyObject {
|
2023-04-15 16:21:54 +08:00
|
|
|
|
/**
|
2023-04-20 21:49:26 +08:00
|
|
|
|
* 上传进度百分比
|
2023-04-15 16:21:54 +08:00
|
|
|
|
*/
|
2023-03-23 20:09:00 +08:00
|
|
|
|
progress: number;
|
2023-04-20 21:49:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 下载进度对象
|
|
|
|
|
*/
|
|
|
|
|
export interface AxiosDownloadProgressEvent extends AxiosProgressEvent {
|
|
|
|
|
/**
|
|
|
|
|
* 已经下载的数据长度,单位 Bytes
|
|
|
|
|
*/
|
|
|
|
|
totalBytesWritten: number;
|
|
|
|
|
/**
|
|
|
|
|
* 预预期需要下载的数据总长度,单位 Bytes
|
|
|
|
|
*/
|
|
|
|
|
totalBytesExpectedToWrite: number;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 监听下载进度
|
|
|
|
|
*/
|
|
|
|
|
export interface AxiosDownloadProgressCallback {
|
|
|
|
|
(event: AxiosDownloadProgressEvent): void;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 上传进度对象
|
|
|
|
|
*/
|
|
|
|
|
export interface AxiosUploadProgressEvent extends AxiosProgressEvent {
|
2023-04-15 16:21:54 +08:00
|
|
|
|
/**
|
2023-04-20 21:49:26 +08:00
|
|
|
|
* 已经上传的数据长度,单位 Bytes
|
2023-04-15 16:21:54 +08:00
|
|
|
|
*/
|
2023-03-23 20:09:00 +08:00
|
|
|
|
totalBytesSent: number;
|
2023-04-15 16:21:54 +08:00
|
|
|
|
/**
|
2023-04-20 21:49:26 +08:00
|
|
|
|
* 预期需要上传的数据总长度,单位 Bytes
|
2023-04-15 16:21:54 +08:00
|
|
|
|
*/
|
2023-03-23 20:09:00 +08:00
|
|
|
|
totalBytesExpectedToSend: number;
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-18 23:08:49 +08:00
|
|
|
|
/**
|
2023-04-20 21:49:26 +08:00
|
|
|
|
* 监听上传进度
|
2023-04-18 23:08:49 +08:00
|
|
|
|
*/
|
2023-04-20 21:49:26 +08:00
|
|
|
|
export interface AxiosUploadProgressCallback {
|
|
|
|
|
(event: AxiosUploadProgressEvent): void;
|
2023-03-23 20:09:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-04-18 23:08:49 +08:00
|
|
|
|
/**
|
|
|
|
|
* 请求配置
|
|
|
|
|
*/
|
2023-03-28 20:35:40 +08:00
|
|
|
|
export interface AxiosRequestConfig
|
2023-04-09 15:20:10 +08:00
|
|
|
|
extends Partial<
|
|
|
|
|
Omit<AxiosAdapterRequestConfig, 'type' | 'success' | 'fail'>
|
2023-03-28 20:35:40 +08:00
|
|
|
|
> {
|
|
|
|
|
/**
|
|
|
|
|
* 请求适配器
|
|
|
|
|
*/
|
2023-03-23 20:09:00 +08:00
|
|
|
|
adapter?: AxiosAdapter;
|
2023-03-28 20:35:40 +08:00
|
|
|
|
/**
|
|
|
|
|
* 基础路径
|
|
|
|
|
*/
|
2023-03-23 20:09:00 +08:00
|
|
|
|
baseURL?: string;
|
2023-04-09 15:20:10 +08:00
|
|
|
|
/**
|
|
|
|
|
* 请求的 URL
|
|
|
|
|
*/
|
|
|
|
|
url?: string;
|
2023-03-28 20:35:40 +08:00
|
|
|
|
/**
|
|
|
|
|
* 请求参数
|
|
|
|
|
*/
|
|
|
|
|
params?: AnyObject;
|
|
|
|
|
/**
|
|
|
|
|
* 请求数据
|
|
|
|
|
*/
|
2023-04-06 15:16:12 +08:00
|
|
|
|
data?: AxiosRequestData;
|
2023-03-28 20:35:40 +08:00
|
|
|
|
/**
|
|
|
|
|
* 请求头
|
|
|
|
|
*/
|
|
|
|
|
headers?: AxiosRequestHeaders;
|
|
|
|
|
/**
|
|
|
|
|
* 请求方法
|
|
|
|
|
*/
|
|
|
|
|
method?: AxiosRequestMethod;
|
|
|
|
|
/**
|
|
|
|
|
* 取消令牌
|
|
|
|
|
*/
|
2023-03-23 20:09:00 +08:00
|
|
|
|
cancelToken?: CancelToken;
|
2023-03-28 20:35:40 +08:00
|
|
|
|
/**
|
2023-04-19 12:00:06 +08:00
|
|
|
|
* 下载文件
|
|
|
|
|
*/
|
|
|
|
|
download?: boolean;
|
|
|
|
|
/**
|
|
|
|
|
* 上传文件
|
2023-03-28 20:35:40 +08:00
|
|
|
|
*/
|
|
|
|
|
upload?: boolean;
|
|
|
|
|
/**
|
2023-04-19 12:00:06 +08:00
|
|
|
|
* 请求参数系列化函数
|
2023-03-28 20:35:40 +08:00
|
|
|
|
*/
|
2023-04-19 12:00:06 +08:00
|
|
|
|
paramsSerializer?: (params?: AnyObject) => string;
|
|
|
|
|
/**
|
|
|
|
|
* 校验状态码
|
|
|
|
|
*/
|
|
|
|
|
validateStatus?: (status: number) => boolean;
|
2023-03-28 20:35:40 +08:00
|
|
|
|
/**
|
|
|
|
|
* 转换请求数据
|
|
|
|
|
*/
|
2023-04-09 15:20:10 +08:00
|
|
|
|
transformRequest?: AxiosTransformer<AxiosRequestData>;
|
2023-03-28 20:35:40 +08:00
|
|
|
|
/**
|
|
|
|
|
* 转换响应数据
|
|
|
|
|
*/
|
2023-04-09 15:20:10 +08:00
|
|
|
|
transformResponse?: AxiosTransformer<AxiosResponseData>;
|
2023-03-28 20:35:40 +08:00
|
|
|
|
/**
|
2023-04-16 13:39:10 +08:00
|
|
|
|
* 错误处理
|
2023-03-28 20:35:40 +08:00
|
|
|
|
*/
|
2023-04-20 21:49:26 +08:00
|
|
|
|
errorHandler?: (error: unknown) => Promise<AxiosResponse>;
|
2023-03-28 20:35:40 +08:00
|
|
|
|
/**
|
2023-04-20 21:49:26 +08:00
|
|
|
|
* 监听下载进度
|
2023-03-28 20:35:40 +08:00
|
|
|
|
*/
|
2023-04-20 21:49:26 +08:00
|
|
|
|
onDownloadProgress?: AxiosUploadProgressCallback;
|
2023-03-28 20:35:40 +08:00
|
|
|
|
/**
|
2023-04-20 21:49:26 +08:00
|
|
|
|
* 监听上传进度
|
2023-03-28 20:35:40 +08:00
|
|
|
|
*/
|
2023-04-20 21:49:26 +08:00
|
|
|
|
onUploadProgress?: AxiosUploadProgressCallback;
|
2023-03-23 20:09:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-04-18 23:08:49 +08:00
|
|
|
|
/**
|
|
|
|
|
* 响应体
|
|
|
|
|
*/
|
2023-04-09 15:20:10 +08:00
|
|
|
|
export interface AxiosResponse<
|
|
|
|
|
TData extends AxiosResponseData = AxiosResponseData,
|
2023-04-18 11:14:57 +08:00
|
|
|
|
> extends AnyObject {
|
2023-04-06 15:16:12 +08:00
|
|
|
|
/**
|
2023-04-18 11:14:57 +08:00
|
|
|
|
* 状态码
|
2023-04-06 15:16:12 +08:00
|
|
|
|
*/
|
2023-04-18 11:14:57 +08:00
|
|
|
|
status: number;
|
2023-04-06 15:16:12 +08:00
|
|
|
|
/**
|
2023-04-18 11:14:57 +08:00
|
|
|
|
* 状态字符
|
2023-04-06 15:16:12 +08:00
|
|
|
|
*/
|
2023-04-18 11:14:57 +08:00
|
|
|
|
statusText: string;
|
|
|
|
|
/**
|
|
|
|
|
* 响应头
|
|
|
|
|
*/
|
|
|
|
|
headers: AnyObject;
|
2023-04-09 15:20:10 +08:00
|
|
|
|
/**
|
|
|
|
|
* 响应数据
|
|
|
|
|
*/
|
|
|
|
|
data: TData;
|
2023-04-18 11:14:57 +08:00
|
|
|
|
/**
|
|
|
|
|
* 请求配置
|
|
|
|
|
*/
|
|
|
|
|
config: AxiosRequestConfig;
|
|
|
|
|
/**
|
|
|
|
|
* 请求任务
|
|
|
|
|
*/
|
2023-04-18 23:08:49 +08:00
|
|
|
|
request?: AxiosAdapterPlatformTask;
|
2023-03-23 20:09:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-04-18 23:08:49 +08:00
|
|
|
|
/**
|
|
|
|
|
* 错误体
|
|
|
|
|
*/
|
2023-04-18 11:14:57 +08:00
|
|
|
|
export interface AxiosResponseError extends AnyObject {
|
|
|
|
|
/**
|
|
|
|
|
* 状态码
|
|
|
|
|
*/
|
|
|
|
|
status: number;
|
|
|
|
|
/**
|
|
|
|
|
* 状态字符
|
|
|
|
|
*/
|
|
|
|
|
statusText: string;
|
|
|
|
|
/**
|
|
|
|
|
* 响应头
|
|
|
|
|
*/
|
|
|
|
|
headers: AnyObject;
|
|
|
|
|
/**
|
|
|
|
|
* 错误数据
|
|
|
|
|
*/
|
2023-04-20 13:56:17 +08:00
|
|
|
|
data: AnyObject;
|
2023-04-06 15:16:12 +08:00
|
|
|
|
/**
|
2023-04-11 13:13:45 +08:00
|
|
|
|
* 失败的请求,指没能够成功响应的请求
|
2023-04-06 15:16:12 +08:00
|
|
|
|
*/
|
2023-04-05 13:31:48 +08:00
|
|
|
|
isFail: true;
|
2023-04-06 15:16:12 +08:00
|
|
|
|
/**
|
|
|
|
|
* 请求配置
|
|
|
|
|
*/
|
2023-04-18 11:14:57 +08:00
|
|
|
|
config: AxiosRequestConfig;
|
2023-04-06 15:16:12 +08:00
|
|
|
|
/**
|
|
|
|
|
* 请求任务
|
|
|
|
|
*/
|
2023-04-18 23:08:49 +08:00
|
|
|
|
request?: AxiosAdapterPlatformTask;
|
2023-03-23 20:09:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-04-18 23:08:49 +08:00
|
|
|
|
/**
|
|
|
|
|
* Axios 构造函数
|
|
|
|
|
*/
|
2023-03-23 20:09:00 +08:00
|
|
|
|
export interface AxiosConstructor {
|
|
|
|
|
new (config: AxiosRequestConfig): Axios;
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-06 22:59:49 +08:00
|
|
|
|
export default class Axios extends AxiosDomain {
|
2023-04-06 15:16:12 +08:00
|
|
|
|
/**
|
|
|
|
|
* 拦截器
|
|
|
|
|
*/
|
2023-04-06 16:00:04 +08:00
|
|
|
|
interceptors = {
|
2023-04-06 15:16:12 +08:00
|
|
|
|
/**
|
|
|
|
|
* 请求拦截器
|
|
|
|
|
*/
|
2023-03-23 20:09:00 +08:00
|
|
|
|
request: new InterceptorManager<AxiosRequestConfig>(),
|
2023-04-06 15:16:12 +08:00
|
|
|
|
/**
|
|
|
|
|
* 响应拦截器
|
|
|
|
|
*/
|
2023-03-23 20:09:00 +08:00
|
|
|
|
response: new InterceptorManager<AxiosResponse>(),
|
|
|
|
|
};
|
|
|
|
|
|
2023-04-06 16:00:04 +08:00
|
|
|
|
constructor(defaults: AxiosRequestConfig = {}) {
|
2023-04-23 23:05:30 +08:00
|
|
|
|
super(defaults, (...args) => this.#processRequest(...args));
|
2023-03-23 20:09:00 +08:00
|
|
|
|
}
|
|
|
|
|
|
2023-04-06 16:00:04 +08:00
|
|
|
|
getUri(config: AxiosRequestConfig): string {
|
2023-03-23 20:09:00 +08:00
|
|
|
|
const { url, params, paramsSerializer } = mergeConfig(
|
|
|
|
|
this.defaults,
|
|
|
|
|
config,
|
|
|
|
|
);
|
|
|
|
|
return buildURL(url, params, paramsSerializer).replace(/^\?/, '');
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-06 15:16:12 +08:00
|
|
|
|
/**
|
2023-04-06 22:59:49 +08:00
|
|
|
|
* 派生领域
|
2023-04-06 15:16:12 +08:00
|
|
|
|
*/
|
2023-04-19 12:00:06 +08:00
|
|
|
|
fork = (config: AxiosRequestConfig = {}) => {
|
2023-04-23 23:05:30 +08:00
|
|
|
|
config.baseURL = combineURL(this.defaults.baseURL, config.baseURL);
|
|
|
|
|
const domain = new AxiosDomain(
|
|
|
|
|
mergeConfig(this.defaults, config),
|
|
|
|
|
(...args) => this.#processRequest(...args),
|
2023-04-08 22:37:50 +08:00
|
|
|
|
);
|
2023-04-23 23:05:30 +08:00
|
|
|
|
domain.flush = this.middleware.wrap(domain.flush);
|
|
|
|
|
return domain;
|
2023-04-17 19:27:44 +08:00
|
|
|
|
};
|
2023-04-06 22:59:49 +08:00
|
|
|
|
|
2023-04-23 23:05:30 +08:00
|
|
|
|
#processRequest(
|
|
|
|
|
config: AxiosRequestConfig,
|
|
|
|
|
requestHandlerFn: AxiosDomainRequestHandler,
|
|
|
|
|
) {
|
2023-04-20 21:49:26 +08:00
|
|
|
|
const requestHandler = {
|
2023-04-23 23:05:30 +08:00
|
|
|
|
resolved: requestHandlerFn,
|
2023-04-20 21:49:26 +08:00
|
|
|
|
};
|
|
|
|
|
const errorHandler = {
|
|
|
|
|
rejected: config.errorHandler,
|
|
|
|
|
};
|
|
|
|
|
const chain: (
|
|
|
|
|
| Partial<Interceptor<AxiosRequestConfig>>
|
|
|
|
|
| Partial<Interceptor<AxiosResponse>>
|
|
|
|
|
)[] = [];
|
2023-03-23 20:09:00 +08:00
|
|
|
|
|
2023-04-20 21:49:26 +08:00
|
|
|
|
this.interceptors.request.forEach((requestInterceptor) => {
|
|
|
|
|
chain.unshift(requestInterceptor);
|
|
|
|
|
});
|
|
|
|
|
chain.push(requestHandler);
|
|
|
|
|
this.interceptors.response.forEach((responseInterceptor) => {
|
|
|
|
|
chain.push(responseInterceptor);
|
2023-04-18 10:11:29 +08:00
|
|
|
|
});
|
2023-04-20 21:49:26 +08:00
|
|
|
|
chain.push(errorHandler);
|
2023-04-18 10:11:29 +08:00
|
|
|
|
|
2023-04-20 21:49:26 +08:00
|
|
|
|
return chain.reduce(
|
|
|
|
|
(next, { resolved, rejected }) =>
|
|
|
|
|
next.then(
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
resolved,
|
|
|
|
|
rejected,
|
|
|
|
|
),
|
|
|
|
|
Promise.resolve(config),
|
|
|
|
|
) as Promise<AxiosResponse>;
|
2023-04-07 12:39:23 +08:00
|
|
|
|
}
|
2023-03-23 20:09:00 +08:00
|
|
|
|
}
|