Skip to content

Commit

Permalink
fix: data 不支持对象以外的类型
Browse files Browse the repository at this point in the history
  • Loading branch information
zjxxxxxxxxx committed Apr 18, 2023
1 parent d714ed2 commit 4d8ec80
Show file tree
Hide file tree
Showing 12 changed files with 282 additions and 155 deletions.
95 changes: 79 additions & 16 deletions src/adapter.ts
Expand Up @@ -11,8 +11,14 @@ import {
AxiosRequestHeaders,
} from './core/Axios';

/**
* 适配器请求类型
*/
export type AxiosAdapterRequestType = 'request' | 'download' | 'upload';

/**
* 适配器请求方法
*/
export type AxiosAdapterRequestMethod =
| 'OPTIONS'
| 'GET'
Expand All @@ -24,8 +30,19 @@ export type AxiosAdapterRequestMethod =
| 'TRACE'
| 'CONNECT';

/**
* 适配器请求数据
*/
export type AxiosAdapterRequestData = string | AnyObject | ArrayBuffer;

/**
* 适配器响应数据
*/
export type AxiosAdapterResponseData = string | ArrayBuffer | AnyObject;

/**
* 适配器响应体
*/
export interface AxiosAdapterResponse extends AnyObject {
/**
* 状态码
Expand All @@ -45,6 +62,9 @@ export interface AxiosAdapterResponse extends AnyObject {
data: AxiosAdapterResponseData;
}

/**
* 适配器错误体
*/
export interface AxiosAdapterResponseError extends AnyObject {
/**
* 状态码
Expand All @@ -64,6 +84,9 @@ export interface AxiosAdapterResponseError extends AnyObject {
data?: AnyObject;
}

/**
* 适配器请求配置
*/
export interface AxiosAdapterRequestConfig extends AnyObject {
/**
* 请求类型
Expand All @@ -84,7 +107,7 @@ export interface AxiosAdapterRequestConfig extends AnyObject {
/**
* 请求数据
*/
data?: AnyObject;
data?: AxiosAdapterRequestData;
/**
* 请求头
*/
Expand All @@ -111,37 +134,61 @@ export interface AxiosAdapterRequestConfig extends AnyObject {
fail(error: AxiosAdapterResponseError): void;
}

/**
* 请求函数基本选项
*/
export interface AxiosAdapterBaseOptions extends AxiosAdapterRequestConfig {
header?: AxiosRequestHeaders;
success(response: AxiosAdapterResponse): void;
fail(error: AxiosAdapterResponseError): void;
}

/**
* 请求函数选项
*/
export type AxiosAdapterRequestOptions = AxiosAdapterBaseOptions;

/**
* 下载函数选项
*/
export interface AxiosAdapterDownloadOptions extends AxiosAdapterBaseOptions {
filePath?: string;
}

/**
* 上传函数选项
*/
export interface AxiosAdapterUploadOptions
extends AxiosAdapterBaseOptions,
AxiosRequestFormData {
fileName: string;
formData?: AnyObject;
}

export interface AxiosAdapterDownloadOptions extends AxiosAdapterBaseOptions {
filePath?: string;
}

/**
* 请求函数
*/
export interface AxiosAdapterRequest {
(config: AxiosAdapterRequestOptions): AxiosAdapterTask;
(config: AxiosAdapterRequestOptions): AxiosAdapterPlatformTask;
}

export interface AxiosAdapterUpload {
(config: AxiosAdapterUploadOptions): AxiosAdapterTask;
/**
* 下载函数
*/
export interface AxiosAdapterDownload {
(config: AxiosAdapterDownloadOptions): AxiosAdapterPlatformTask;
}

export interface AxiosAdapterDownload {
(config: AxiosAdapterDownloadOptions): AxiosAdapterTask;
/**
* 上传函数
*/
export interface AxiosAdapterUpload {
(config: AxiosAdapterUploadOptions): AxiosAdapterPlatformTask;
}

/**
* 适配器平台
*/
export interface AxiosAdapterPlatform {
/**
* 发送请求
Expand All @@ -157,7 +204,10 @@ export interface AxiosAdapterPlatform {
upload: AxiosAdapterUpload;
}

export type AxiosAdapterTask =
/**
* 适配器平台请求任务
*/
export type AxiosAdapterPlatformTask =
| undefined
| void
| {
Expand All @@ -166,10 +216,16 @@ export type AxiosAdapterTask =
offProgressUpdate?(callback: AxiosProgressCallback): void;
};

/**
* 适配器函数
*/
export interface AxiosAdapter {
(config: AxiosAdapterRequestConfig): AxiosAdapterTask;
(config: AxiosAdapterRequestConfig): AxiosAdapterPlatformTask;
}

/**
* 获取支持的平台适配器
*/
export function getDefaultAdapter() {
const platform = revisePlatformApiNames(getPlatform());

Expand Down Expand Up @@ -220,13 +276,20 @@ export function getDefaultAdapter() {
return createAdapter(platform);
}

/**
* 创建适配器
*
* @param platform 平台 API 对象
*/
export function createAdapter(platform: AxiosAdapterPlatform) {
assert(isPlainObject(platform), 'platform 不是一个 object');
assert(isFunction(platform.request), 'request 不是一个 function');
assert(isFunction(platform.upload), 'upload 不是一个 function');
assert(isFunction(platform.download), 'download 不是一个 function');

function adapter(config: AxiosAdapterRequestConfig): AxiosAdapterTask {
function adapter(
config: AxiosAdapterRequestConfig,
): AxiosAdapterPlatformTask {
const baseOptions = transformOptions(config);

switch (config.type) {
Expand All @@ -242,14 +305,14 @@ export function createAdapter(platform: AxiosAdapterPlatform) {
function processRequest(
request: AxiosAdapterRequest,
baseOptions: AxiosAdapterBaseOptions,
): AxiosAdapterTask {
): AxiosAdapterPlatformTask {
return request(baseOptions);
}

function processUpload(
upload: AxiosAdapterUpload,
baseOptions: AxiosAdapterBaseOptions,
): AxiosAdapterTask {
): AxiosAdapterPlatformTask {
const { name, filePath, fileType, ...formData } =
baseOptions.data as AxiosRequestFormData;
const options = {
Expand All @@ -273,7 +336,7 @@ export function createAdapter(platform: AxiosAdapterPlatform) {
function processDownload(
download: AxiosAdapterDownload,
baseOptions: AxiosAdapterBaseOptions,
): AxiosAdapterTask {
): AxiosAdapterPlatformTask {
const options: AxiosAdapterDownloadOptions = {
...baseOptions,
filePath: baseOptions.params?.filePath,
Expand Down
13 changes: 11 additions & 2 deletions src/axios.ts
Expand Up @@ -10,20 +10,29 @@ import { mergeConfig } from './core/mergeConfig';
import { createAdapter } from './adapter';
import defaults from './defaults';

/**
* axios 实例默认配置
*/
export interface AxiosInstanceDefaults extends AxiosRequestConfig {
/**
* 请求头
*/
headers: Required<AxiosRequestHeaders>;
}

/**
* axios 实例
*/
export interface AxiosInstance extends AxiosDomainRequest, Axios {
/**
* 默认请求配置
*/
defaults: AxiosInstanceDefaults;
}

/**
* axios 静态对象
*/
export interface AxiosStatic extends AxiosInstance {
/**
* Axios 类
Expand All @@ -44,11 +53,11 @@ export interface AxiosStatic extends AxiosInstance {
*/
createAdapter: typeof createAdapter;
/**
* 判断 Cancel
* 传入取消请求错误返回 true
*/
isCancel: typeof isCancel;
/**
* 判断 AxiosError
* 传入响应错误返回 true
*/
isAxiosError: typeof isAxiosError;
}
Expand Down
53 changes: 47 additions & 6 deletions src/core/Axios.ts
Expand Up @@ -5,7 +5,7 @@ import { isFunction, isPromise, isString } from '../helpers/isTypes';
import {
AxiosAdapter,
AxiosAdapterRequestMethod,
AxiosAdapterTask,
AxiosAdapterPlatformTask,
AxiosAdapterRequestConfig,
AxiosAdapterResponseData,
} from '../adapter';
Expand All @@ -14,9 +14,11 @@ import { mergeConfig } from './mergeConfig';
import { CancelToken } from './cancel';
import { dispatchRequest } from './dispatchRequest';
import { AxiosTransformer } from './transformData';

import AxiosDomain from './AxiosDomain';

/**
* 请求方法
*/
export type AxiosRequestMethod =
| AxiosAdapterRequestMethod
| 'options'
Expand All @@ -29,6 +31,9 @@ export type AxiosRequestMethod =
| 'trace'
| 'connect';

/**
* 请求头
*/
export interface AxiosRequestHeaders extends AnyObject {
/**
* 通用请求头
Expand Down Expand Up @@ -68,6 +73,9 @@ export interface AxiosRequestHeaders extends AnyObject {
connect?: AnyObject;
}

/**
* 表单数据(上传会用到)
*/
export interface AxiosRequestFormData extends AnyObject {
/**
* 文件名
Expand All @@ -79,10 +87,23 @@ export interface AxiosRequestFormData extends AnyObject {
filePath: string;
}

export type AxiosRequestData = AnyObject | AxiosRequestFormData;
/**
* 请求数据
*/
export type AxiosRequestData =
| string
| AnyObject
| ArrayBuffer
| AxiosRequestFormData;

/**
* 响应数据
*/
export type AxiosResponseData = undefined | number | AxiosAdapterResponseData;

/**
* 监听进度回调事件对象
*/
export interface AxiosProgressEvent {
/**
* 下载进度
Expand All @@ -98,10 +119,21 @@ export interface AxiosProgressEvent {
totalBytesExpectedToSend: number;
}

/**
* 监听进度回调
*/
export interface AxiosProgressCallback {
(event: AxiosProgressEvent): void;
(
/**
* 事件对象
*/
event: AxiosProgressEvent,
): void;
}

/**
* 请求配置
*/
export interface AxiosRequestConfig
extends Partial<
Omit<AxiosAdapterRequestConfig, 'type' | 'success' | 'fail'>
Expand Down Expand Up @@ -176,6 +208,9 @@ export interface AxiosRequestConfig
validateStatus?: (status: number) => boolean;
}

/**
* 响应体
*/
export interface AxiosResponse<
TData extends AxiosResponseData = AxiosResponseData,
> extends AnyObject {
Expand All @@ -202,9 +237,12 @@ export interface AxiosResponse<
/**
* 请求任务
*/
request?: AxiosAdapterTask;
request?: AxiosAdapterPlatformTask;
}

/**
* 错误体
*/
export interface AxiosResponseError extends AnyObject {
/**
* 状态码
Expand Down Expand Up @@ -233,9 +271,12 @@ export interface AxiosResponseError extends AnyObject {
/**
* 请求任务
*/
request?: AxiosAdapterTask;
request?: AxiosAdapterPlatformTask;
}

/**
* Axios 构造函数
*/
export interface AxiosConstructor {
new (config: AxiosRequestConfig): Axios;
}
Expand Down

0 comments on commit 4d8ec80

Please sign in to comment.