feat: 支持自定义配置

pull/41/head
zjx0905 2023-03-28 20:35:40 +08:00
parent 01e4167ad4
commit b15b31ee55
7 changed files with 188 additions and 149 deletions

View File

@ -17,22 +17,12 @@ axios.defaults.adapter = function adapter(adapterConfig) {
data, data,
// 请求头 同 headers // 请求头 同 headers
headers, headers,
// 请求头 同 headers
headers,
// 响应数据格式 // 响应数据格式
dataType, dataType,
// 响应数据类型 // 响应数据类型
responseType, responseType,
// 超时时间 // 超时时间
timeout, timeout,
// 开启 http2
enableHttp2,
// 开启 quic
enableQuic,
// 开启 cache
enableCache,
// 验证 ssl 证书
sslVerify,
// 成功的回调函数 // 成功的回调函数
success, success,
// 失败的回调函数 // 失败的回调函数
@ -46,7 +36,7 @@ axios.defaults.adapter = function adapter(adapterConfig) {
url, url,
method, method,
data, data,
headers, header: headers,
success, success,
fail, fail,
}); });
@ -54,8 +44,8 @@ axios.defaults.adapter = function adapter(adapterConfig) {
return wx.uploadFile({ return wx.uploadFile({
url, url,
method, method,
data, formData: data,
headers, header: headers,
success, success,
fail, fail,
}); });
@ -63,8 +53,8 @@ axios.defaults.adapter = function adapter(adapterConfig) {
return wx.downloadFile({ return wx.downloadFile({
url, url,
method, method,
data, filePath: data.filePath,
headers, header: headers,
success, success,
fail, fail,
}); });

View File

@ -8,8 +8,6 @@ import {
import { assert, throwError } from './helpers/utils'; import { assert, throwError } from './helpers/utils';
import { import {
AxiosProgressCallback, AxiosProgressCallback,
AxiosRequestConfig,
AxiosRequestData,
AxiosRequestFormData, AxiosRequestFormData,
AxiosRequestHeaders, AxiosRequestHeaders,
AxiosResponse, AxiosResponse,
@ -28,12 +26,60 @@ export type AxiosAdapterRequestMethod =
| 'TRACE' | 'TRACE'
| 'CONNECT'; | 'CONNECT';
export interface AxiosAdapterRequestConfig extends AxiosRequestConfig { export interface AxiosAdapterResponse<TData = unknown> extends AnyObject {
type: AxiosAdapterRequestType; status: number;
method: AxiosAdapterRequestMethod; statusText: string;
headers: AnyObject;
data: TData;
}
export interface AxiosAdapterResponseError extends AnyObject {
status: number;
statusText: string;
headers: AnyObject;
}
export interface AxiosAdapterRequestConfig extends AnyObject {
/**
*
*/
type: 'request' | 'upload' | 'download';
/**
*
*/
url: string; url: string;
success(response: AxiosResponse): void; /**
fail(error: AxiosResponseError): void; * HTTP
*/
method: AxiosAdapterRequestMethod;
/**
*
*/
data?: AnyObject;
/**
*
*/
headers?: AnyObject;
/**
*
*/
dataType?: 'json' | '其他';
/**
*
*/
responseType?: 'text' | 'arraybuffer';
/**
* 60000
*/
timeout?: number;
/**
*
*/
success(response: AxiosAdapterResponse): void;
/**
*
*/
fail(error: AxiosAdapterResponseError): void;
} }
export interface AxiosAdapterBaseOptions extends AxiosAdapterRequestConfig { export interface AxiosAdapterBaseOptions extends AxiosAdapterRequestConfig {
@ -47,8 +93,7 @@ export interface AxiosAdapterUploadOptions extends AxiosAdapterBaseOptions {
name: string; name: string;
fileName: string; fileName: string;
fileType: 'image' | 'video' | 'audio'; fileType: 'image' | 'video' | 'audio';
hideLoading?: boolean; formData?: AnyObject;
formData?: AxiosRequestData;
} }
export interface AxiosAdapterDownloadOptions extends AxiosAdapterBaseOptions { export interface AxiosAdapterDownloadOptions extends AxiosAdapterBaseOptions {
@ -167,7 +212,7 @@ export function createAdapter(platform: AxiosPlatform): AxiosAdapter {
'上传文件时 data.filePath 需要是一个 string', '上传文件时 data.filePath 需要是一个 string',
); );
const { fileName, filePath, fileType, hideLoading, ...formData } = const { fileName, filePath, fileType, ...formData } =
baseOptions.data as AxiosRequestFormData; baseOptions.data as AxiosRequestFormData;
const options = { const options = {
...baseOptions, ...baseOptions,
@ -175,7 +220,6 @@ export function createAdapter(platform: AxiosPlatform): AxiosAdapter {
fileName: fileName, fileName: fileName,
filePath, filePath,
fileType: fileType ?? 'image', fileType: fileType ?? 'image',
hideLoading,
formData, formData,
}; };
@ -200,29 +244,12 @@ export function createAdapter(platform: AxiosPlatform): AxiosAdapter {
} }
function transformResult(result: AnyObject): void { function transformResult(result: AnyObject): void {
if (!isUndefined(result.statusCode)) { result.status = result.status || isUndefined(result.data) ? 400 : 200;
if (result.statusCode) {
result.status = result.statusCode; result.status = result.statusCode;
delete result.statusCode; delete result.statusCode;
} }
if (isUndefined(result.status)) {
result.status = isUndefined(result.data) ? 400 : 200;
}
if (!isUndefined(result.header)) {
result.headers = result.header;
delete result.header;
}
if (isUndefined(result.headers)) {
result.headers = {};
}
if (!isUndefined(result.errMsg)) {
result.statusText = result.errMsg;
delete result.errMsg;
}
if (isUndefined(result.statusText)) { if (isUndefined(result.statusText)) {
result.statusText = result.statusText =
result.status === 200 result.status === 200
@ -231,6 +258,17 @@ export function createAdapter(platform: AxiosPlatform): AxiosAdapter {
? 'Bad Adapter' ? 'Bad Adapter'
: ''; : '';
} }
result.headers = result.headers || {};
if (result.header) {
result.headers = result.header;
delete result.header;
}
if (result.errMsg) {
result.statusText = result.errMsg;
delete result.errMsg;
}
} }
function transformOptions( function transformOptions(
@ -251,21 +289,19 @@ export function createAdapter(platform: AxiosPlatform): AxiosAdapter {
} }
function injectDownloadData(response: AnyObject): void { function injectDownloadData(response: AnyObject): void {
if (!isPlainObject(response.data)) { response.data = response.data || {};
response.data = {};
}
if (!isUndefined(response.tempFilePath)) { if (response.tempFilePath) {
response.data.tempFilePath = response.tempFilePath; response.data.tempFilePath = response.tempFilePath;
delete response.tempFilePath; delete response.tempFilePath;
} }
if (!isUndefined(response.apFilePath)) { if (response.apFilePath) {
response.data.tempFilePath = response.apFilePath; response.data.tempFilePath = response.apFilePath;
delete response.apFilePath; delete response.apFilePath;
} }
if (!isUndefined(response.filePath)) { if (response.filePath) {
response.data.filePath = response.filePath; response.data.filePath = response.filePath;
delete response.filePath; delete response.filePath;
} }

View File

@ -2,6 +2,7 @@ import { AxiosAdapter, createAdapter, AxiosPlatform } from './adapter';
import Axios, { import Axios, {
AxiosConstructor, AxiosConstructor,
AxiosRequestConfig, AxiosRequestConfig,
AxiosRequestHeaders,
AxiosResponse, AxiosResponse,
} from './core/Axios'; } from './core/Axios';
import { CancelToken, CancelTokenConstructor, isCancel } from './core/cancel'; import { CancelToken, CancelTokenConstructor, isCancel } from './core/cancel';
@ -18,6 +19,7 @@ export interface AxiosInstance extends Axios {
export interface AxiosStatic extends AxiosInstance { export interface AxiosStatic extends AxiosInstance {
Axios: AxiosConstructor; Axios: AxiosConstructor;
defaults: AxiosRequestConfig & { headers: Required<AxiosRequestHeaders> };
CancelToken: CancelTokenConstructor; CancelToken: CancelTokenConstructor;
create(defaults?: AxiosRequestConfig): AxiosInstance; create(defaults?: AxiosRequestConfig): AxiosInstance;
createAdapter(platform: AxiosPlatform): AxiosAdapter; createAdapter(platform: AxiosPlatform): AxiosAdapter;

View File

@ -1,16 +1,20 @@
import { buildURL } from '../helpers/url'; import { buildURL } from '../helpers/url';
import { mergeConfig } from './mergeConfig'; import { mergeConfig } from './mergeConfig';
import { import {
AxiosAdapterRequestMethod,
AxiosAdapter, AxiosAdapter,
AxiosAdapterRequestMethod,
AxiosAdapterTask, AxiosAdapterTask,
AxiosAdapterResponse,
AxiosAdapterResponseError,
AxiosAdapterRequestConfig,
} from '../adapter'; } from '../adapter';
import { CancelToken } from './cancel'; import { CancelToken } from './cancel';
import dispatchRequest from './dispatchRequest'; import dispatchRequest from './dispatchRequest';
import InterceptorManager from './InterceptorManager'; import InterceptorManager from './InterceptorManager';
import { AxiosTransformer } from './transformData'; import { AxiosTransformer } from './transformData';
export type AxiosRequestMethodAlias = export type AxiosRequestMethod =
| AxiosAdapterRequestMethod
| 'options' | 'options'
| 'get' | 'get'
| 'head' | 'head'
@ -20,23 +24,21 @@ export type AxiosRequestMethodAlias =
| 'trace' | 'trace'
| 'connect'; | 'connect';
export type AxiosRequestMethod = export interface AxiosRequestHeaders extends AnyObject {
| AxiosAdapterRequestMethod options?: AnyObject;
| AxiosRequestMethodAlias; get?: AnyObject;
head?: AnyObject;
post?: AnyObject;
put?: AnyObject;
delete?: AnyObject;
trace?: AnyObject;
connect?: AnyObject;
}
export type AxiosRequestHeaders = AnyObject; export interface AxiosRequestFormData extends AnyObject {
export type AxiosRequestParams = AnyObject;
export type AxiosRequestData = AnyObject;
export type AxiosResponseHeaders = AnyObject;
export interface AxiosRequestFormData extends AxiosRequestData {
fileName: string; fileName: string;
filePath: string; filePath: string;
fileType?: 'image' | 'video' | 'audio'; fileType?: 'image' | 'video' | 'audio';
hideLoading?: boolean;
} }
export interface AxiosProgressEvent { export interface AxiosProgressEvent {
@ -49,48 +51,84 @@ export interface AxiosProgressCallback {
(event: AxiosProgressEvent): void; (event: AxiosProgressEvent): void;
} }
export interface AxiosRequestConfig { export interface AxiosRequestConfig
extends Omit<
Partial<AxiosAdapterRequestConfig>,
'type' | 'method' | 'success' | 'fail'
> {
/**
*
*/
adapter?: AxiosAdapter; adapter?: AxiosAdapter;
/**
*
*/
baseURL?: string; baseURL?: string;
cancelToken?: CancelToken; /**
data?: AxiosRequestData | AxiosRequestFormData | AxiosRequestFormData; *
dataType?: 'json' | '其他'; */
download?: boolean; params?: AnyObject;
enableHttp2?: boolean; /**
enableQuic?: boolean; *
enableCache?: boolean; */
errorHandler?: (error: unknown) => Promise<unknown>; data?: AnyObject | AxiosRequestFormData;
/**
*
*/
headers?: AxiosRequestHeaders; headers?: AxiosRequestHeaders;
/**
*
*/
method?: AxiosRequestMethod; method?: AxiosRequestMethod;
onUploadProgress?: AxiosProgressCallback; /**
onDownloadProgress?: AxiosProgressCallback; *
params?: AxiosRequestParams; */
paramsSerializer?: (params?: AxiosRequestParams) => string; cancelToken?: CancelToken;
responseType?: 'text' | 'arraybuffer'; /**
sslVerify?: boolean; *
transformRequest?: AxiosTransformer | AxiosTransformer[]; */
transformResponse?: AxiosTransformer | AxiosTransformer[];
timeout?: number;
upload?: boolean; upload?: boolean;
url?: string; /**
*
*/
download?: boolean;
/**
*
*/
transformRequest?: AxiosTransformer | AxiosTransformer[];
/**
*
*/
transformResponse?: AxiosTransformer | AxiosTransformer[];
/**
*
*/
errorHandler?: (error: unknown) => Promise<unknown>;
/**
*
*/
onUploadProgress?: AxiosProgressCallback;
/**
*
*/
onDownloadProgress?: AxiosProgressCallback;
/**
*
*/
paramsSerializer?: (params?: AnyObject) => string;
/**
*
*/
validateStatus?: (status: number) => boolean; validateStatus?: (status: number) => boolean;
} }
export interface AxiosResponse<TData = unknown> { export interface AxiosResponse<TData = unknown>
status: number; extends AxiosAdapterResponse<TData> {
statusText: string;
headers: AxiosResponseHeaders;
data: TData;
config?: AxiosRequestConfig; config?: AxiosRequestConfig;
request?: AxiosAdapterTask; request?: AxiosAdapterTask;
cookies?: string[];
profile?: AnyObject;
} }
export interface AxiosResponseError extends AnyObject { export interface AxiosResponseError extends AxiosAdapterResponseError {
status: number;
statusText: string;
headers: AxiosResponseHeaders;
config?: AxiosRequestConfig; config?: AxiosRequestConfig;
request?: AxiosAdapterTask; request?: AxiosAdapterTask;
} }
@ -149,87 +187,67 @@ export default class Axios {
url: string, url: string,
config?: AxiosRequestConfig, config?: AxiosRequestConfig,
): Promise<AxiosResponse<TData>> { ): Promise<AxiosResponse<TData>> {
return this._requestMethodWithoutParams<TData>( return this._req<TData>('options', url, undefined, config);
'options',
url,
undefined,
config,
);
} }
public get<TData = unknown>( public get<TData = unknown>(
url: string, url: string,
params?: AxiosRequestParams, params?: AnyObject,
config?: AxiosRequestConfig, config?: AxiosRequestConfig,
): Promise<AxiosResponse<TData>> { ): Promise<AxiosResponse<TData>> {
return this._requestMethodWithoutParams<TData>('get', url, params, config); return this._req<TData>('get', url, params, config);
} }
public head<TData = unknown>( public head<TData = unknown>(
url: string, url: string,
params?: AxiosRequestParams, params?: AnyObject,
config?: AxiosRequestConfig, config?: AxiosRequestConfig,
): Promise<AxiosResponse<TData>> { ): Promise<AxiosResponse<TData>> {
return this._requestMethodWithoutParams<TData>('head', url, params, config); return this._req<TData>('head', url, params, config);
} }
public post<TData = unknown>( public post<TData = unknown>(
url: string, url: string,
data?: AxiosRequestData | AxiosRequestFormData, data?: AnyObject | AxiosRequestFormData,
config?: AxiosRequestConfig, config?: AxiosRequestConfig,
): Promise<AxiosResponse<TData>> { ): Promise<AxiosResponse<TData>> {
return this._requestMethodWithoutData<TData>('post', url, data, config); return this._reqWithData<TData>('post', url, data, config);
} }
public put<TData = unknown>( public put<TData = unknown>(
url: string, url: string,
data?: AxiosRequestData | AxiosRequestFormData, data?: AnyObject | AxiosRequestFormData,
config?: AxiosRequestConfig, config?: AxiosRequestConfig,
): Promise<AxiosResponse<TData>> { ): Promise<AxiosResponse<TData>> {
return this._requestMethodWithoutData<TData>('put', url, data, config); return this._reqWithData<TData>('put', url, data, config);
} }
public delete<TData = unknown>( public delete<TData = unknown>(
url: string, url: string,
params?: AxiosRequestParams, params?: AnyObject,
config?: AxiosRequestConfig, config?: AxiosRequestConfig,
): Promise<AxiosResponse<TData>> { ): Promise<AxiosResponse<TData>> {
return this._requestMethodWithoutParams<TData>( return this._req<TData>('delete', url, params, config);
'delete',
url,
params,
config,
);
} }
public trace<TData = unknown>( public trace<TData = unknown>(
url: string, url: string,
config?: AxiosRequestConfig, config?: AxiosRequestConfig,
): Promise<AxiosResponse<TData>> { ): Promise<AxiosResponse<TData>> {
return this._requestMethodWithoutParams<TData>( return this._req<TData>('trace', url, undefined, config);
'trace',
url,
undefined,
config,
);
} }
public connect<TData = unknown>( public connect<TData = unknown>(
url: string, url: string,
config?: AxiosRequestConfig, config?: AxiosRequestConfig,
): Promise<AxiosResponse<TData>> { ): Promise<AxiosResponse<TData>> {
return this._requestMethodWithoutParams<TData>( return this._req<TData>('connect', url, undefined, config);
'connect',
url,
undefined,
config,
);
} }
private _requestMethodWithoutParams<TData = unknown>( private _req<TData = unknown>(
method: AxiosRequestMethod, method: AxiosRequestMethod,
url: string, url: string,
params?: AxiosRequestParams, params?: AnyObject,
config?: AxiosRequestConfig, config?: AxiosRequestConfig,
): Promise<AxiosResponse<TData>> { ): Promise<AxiosResponse<TData>> {
return this.request<TData>({ return this.request<TData>({
@ -240,10 +258,10 @@ export default class Axios {
}); });
} }
private _requestMethodWithoutData<TData = unknown>( private _reqWithData<TData = unknown>(
method: AxiosRequestMethod, method: AxiosRequestMethod,
url: string, url: string,
data?: AxiosRequestData | AxiosRequestFormData, data?: AnyObject | AxiosRequestFormData,
config?: AxiosRequestConfig, config?: AxiosRequestConfig,
): Promise<AxiosResponse<TData>> { ): Promise<AxiosResponse<TData>> {
return this.request<TData>({ return this.request<TData>({

View File

@ -1,22 +1,17 @@
import { isArray, isUndefined } from '../helpers/is'; import { isArray, isUndefined } from '../helpers/is';
import { import { AxiosRequestFormData } from './Axios';
AxiosRequestData,
AxiosRequestFormData,
AxiosResponseHeaders,
} from './Axios';
export interface AxiosTransformer { export interface AxiosTransformer {
( (data?: AnyObject | AxiosRequestFormData, headers?: AnyObject):
data?: AxiosRequestData | AxiosRequestFormData, | AnyObject
headers?: AxiosResponseHeaders, | AxiosRequestFormData;
): AxiosRequestData | AxiosRequestFormData;
} }
export function transformData( export function transformData(
data?: AxiosRequestData | AxiosRequestFormData, data?: AnyObject | AxiosRequestFormData,
headers?: AxiosResponseHeaders, headers?: AnyObject,
transforms?: AxiosTransformer | AxiosTransformer[], transforms?: AxiosTransformer | AxiosTransformer[],
): AxiosRequestData | AxiosRequestFormData | undefined { ): AnyObject | AxiosRequestFormData | undefined {
if (isUndefined(transforms)) { if (isUndefined(transforms)) {
return data; return data;
} }

View File

@ -26,10 +26,6 @@ const defaults: AxiosRequestConfig = {
timeout: 10000, timeout: 10000,
dataType: 'json', dataType: 'json',
responseType: 'text', responseType: 'text',
enableHttp2: false,
enableQuic: false,
enableCache: false,
sslVerify: true,
}; };
export default defaults; export default defaults;

View File

@ -8,6 +8,8 @@ export type {
} from './core/Axios'; } from './core/Axios';
export type { export type {
AxiosAdapterRequestConfig, AxiosAdapterRequestConfig,
AxiosAdapterResponse,
AxiosAdapterResponseError,
AxiosAdapter, AxiosAdapter,
AxiosPlatform, AxiosPlatform,
} from './adapter'; } from './adapter';