feat: 支持自定义配置
parent
01e4167ad4
commit
b15b31ee55
|
@ -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,
|
||||
});
|
||||
|
|
108
src/adapter.ts
108
src/adapter.ts
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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>({
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -26,10 +26,6 @@ const defaults: AxiosRequestConfig = {
|
|||
timeout: 10000,
|
||||
dataType: 'json',
|
||||
responseType: 'text',
|
||||
enableHttp2: false,
|
||||
enableQuic: false,
|
||||
enableCache: false,
|
||||
sslVerify: true,
|
||||
};
|
||||
|
||||
export default defaults;
|
||||
|
|
|
@ -8,6 +8,8 @@ export type {
|
|||
} from './core/Axios';
|
||||
export type {
|
||||
AxiosAdapterRequestConfig,
|
||||
AxiosAdapterResponse,
|
||||
AxiosAdapterResponseError,
|
||||
AxiosAdapter,
|
||||
AxiosPlatform,
|
||||
} from './adapter';
|
||||
|
|
Loading…
Reference in New Issue