import { buildURL } from '../helpers/url'; import { mergeConfig } from './mergeConfig'; import { AdapterRequestMethod, AxiosAdapter, AxiosAdapterTask, } from './adapter'; import { CancelToken } from './cancel'; import dispatchRequest from './dispatchRequest'; import InterceptorManager from './InterceptorManager'; import { AxiosTransformer } from './transformData'; export type AxiosRequestMethodAlias = | 'options' | 'get' | 'head' | 'post' | 'put' | 'delete' | 'trace' | 'connect'; export type AxiosRequestMethod = AdapterRequestMethod | AxiosRequestMethodAlias; export type AxiosRequestHeaders = AnyObject; export type AxiosRequestParams = AnyObject; export type AxiosRequestData = AnyObject; export type AxiosResponseHeaders = AnyObject; export interface AxiosRequestFormData extends AxiosRequestData { fileName: string; filePath: string; fileType?: 'image' | 'video' | 'audio'; hideLoading?: boolean; } export interface AxiosProgressEvent { progress: number; totalBytesSent: number; totalBytesExpectedToSend: number; } export interface AxiosProgressCallback { (event: AxiosProgressEvent): void; } export interface AxiosRequestConfig { adapter?: AxiosAdapter; baseURL?: string; cancelToken?: CancelToken; data?: AxiosRequestData | AxiosRequestFormData | AxiosRequestFormData; dataType?: 'json' | '其他'; download?: boolean; enableHttp2?: boolean; enableQuic?: boolean; enableCache?: boolean; errorHandler?: (error: any) => Promise; headers?: AxiosRequestHeaders; method?: AxiosRequestMethod; onUploadProgress?: AxiosProgressCallback; onDownloadProgress?: AxiosProgressCallback; params?: AxiosRequestParams; paramsSerializer?: (params?: AxiosRequestParams) => string; responseType?: 'text' | 'arraybuffer'; sslVerify?: boolean; transformRequest?: AxiosTransformer | AxiosTransformer[]; transformResponse?: AxiosTransformer | AxiosTransformer[]; timeout?: number; upload?: boolean; url?: string; validateStatus?: (status: number) => boolean; } export interface AxiosResponse { status: number; statusText: string; headers: AxiosResponseHeaders; data: TData; config?: AxiosRequestConfig; request?: AxiosAdapterTask; cookies?: string[]; profile?: AnyObject; } export interface AxiosResponseError extends AnyObject { status: number; statusText: string; headers: AxiosResponseHeaders; config?: AxiosRequestConfig; request?: AxiosAdapterTask; } export interface AxiosConstructor { new (config: AxiosRequestConfig): Axios; } export default class Axios { public defaults: AxiosRequestConfig; public interceptors = { request: new InterceptorManager(), response: new InterceptorManager(), }; public constructor(defaults: AxiosRequestConfig = {}) { this.defaults = defaults; } public getUri(config: AxiosRequestConfig): string { const { url, params, paramsSerializer } = mergeConfig( this.defaults, config, ); return buildURL(url, params, paramsSerializer).replace(/^\?/, ''); } public request( config: AxiosRequestConfig, ): Promise> { const requestConfig = mergeConfig(this.defaults, config); let promiseRequest = Promise.resolve(requestConfig); this.interceptors.request.forEach(({ resolved, rejected }) => { promiseRequest = promiseRequest.then(resolved, rejected); }, 'reverse'); let promiseResponse = promiseRequest.then(dispatchRequest); this.interceptors.response.forEach(({ resolved, rejected }) => { promiseResponse = promiseResponse.then(resolved, rejected); }); return promiseResponse as Promise>; } public options( url: string, config?: AxiosRequestConfig, ): Promise> { return this._requestMethodWithoutParams( 'options', url, undefined, config, ); } public get( url: string, params?: AxiosRequestParams, config?: AxiosRequestConfig, ): Promise> { return this._requestMethodWithoutParams('get', url, params, config); } public head( url: string, params?: AxiosRequestParams, config?: AxiosRequestConfig, ): Promise> { return this._requestMethodWithoutParams('head', url, params, config); } public post( url: string, data?: AxiosRequestData | AxiosRequestFormData, config?: AxiosRequestConfig, ): Promise> { return this._requestMethodWithoutData('post', url, data, config); } public put( url: string, data?: AxiosRequestData | AxiosRequestFormData, config?: AxiosRequestConfig, ): Promise> { return this._requestMethodWithoutData('put', url, data, config); } public delete( url: string, params?: AxiosRequestParams, config?: AxiosRequestConfig, ): Promise> { return this._requestMethodWithoutParams( 'delete', url, params, config, ); } public trace( url: string, config?: AxiosRequestConfig, ): Promise> { return this._requestMethodWithoutParams( 'trace', url, undefined, config, ); } public connect( url: string, config?: AxiosRequestConfig, ): Promise> { return this._requestMethodWithoutParams( 'connect', url, undefined, config, ); } private _requestMethodWithoutParams( method: AxiosRequestMethod, url: string, params?: AxiosRequestParams, config?: AxiosRequestConfig, ): Promise> { return this.request({ ...(config ?? {}), method, url, params, }); } private _requestMethodWithoutData( method: AxiosRequestMethod, url: string, data?: AxiosRequestData | AxiosRequestFormData, config?: AxiosRequestConfig, ): Promise> { return this.request({ ...(config ?? {}), method, url, data, }); } }