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

View File

@ -8,8 +8,6 @@ import {
import { assert, throwError } from './helpers/utils';
import {
AxiosProgressCallback,
AxiosRequestConfig,
AxiosRequestData,
AxiosRequestFormData,
AxiosRequestHeaders,
AxiosResponse,
@ -28,12 +26,60 @@ export type AxiosAdapterRequestMethod =
| 'TRACE'
| 'CONNECT';
export interface AxiosAdapterRequestConfig extends AxiosRequestConfig {
type: AxiosAdapterRequestType;
method: AxiosAdapterRequestMethod;
export interface AxiosAdapterResponse<TData = unknown> extends AnyObject {
status: number;
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;
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 {
@ -47,8 +93,7 @@ export interface AxiosAdapterUploadOptions extends AxiosAdapterBaseOptions {
name: string;
fileName: string;
fileType: 'image' | 'video' | 'audio';
hideLoading?: boolean;
formData?: AxiosRequestData;
formData?: AnyObject;
}
export interface AxiosAdapterDownloadOptions extends AxiosAdapterBaseOptions {
@ -167,7 +212,7 @@ export function createAdapter(platform: AxiosPlatform): AxiosAdapter {
'上传文件时 data.filePath 需要是一个 string',
);
const { fileName, filePath, fileType, hideLoading, ...formData } =
const { fileName, filePath, fileType, ...formData } =
baseOptions.data as AxiosRequestFormData;
const options = {
...baseOptions,
@ -175,7 +220,6 @@ export function createAdapter(platform: AxiosPlatform): AxiosAdapter {
fileName: fileName,
filePath,
fileType: fileType ?? 'image',
hideLoading,
formData,
};
@ -200,29 +244,12 @@ export function createAdapter(platform: AxiosPlatform): AxiosAdapter {
}
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;
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)) {
result.statusText =
result.status === 200
@ -231,6 +258,17 @@ export function createAdapter(platform: AxiosPlatform): AxiosAdapter {
? '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(
@ -251,21 +289,19 @@ export function createAdapter(platform: AxiosPlatform): AxiosAdapter {
}
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;
delete response.tempFilePath;
}
if (!isUndefined(response.apFilePath)) {
if (response.apFilePath) {
response.data.tempFilePath = response.apFilePath;
delete response.apFilePath;
}
if (!isUndefined(response.filePath)) {
if (response.filePath) {
response.data.filePath = response.filePath;
delete response.filePath;
}

View File

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

View File

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

View File

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

View File

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

View File

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