diff --git a/docs/config/adapter.md b/docs/config/adapter.md index 3ac8f00..a175d64 100644 --- a/docs/config/adapter.md +++ b/docs/config/adapter.md @@ -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, }); diff --git a/src/adapter.ts b/src/adapter.ts index 2943e9d..46307ee 100644 --- a/src/adapter.ts +++ b/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 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; } diff --git a/src/axios.ts b/src/axios.ts index f4b1aea..3b0a13c 100644 --- a/src/axios.ts +++ b/src/axios.ts @@ -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 }; CancelToken: CancelTokenConstructor; create(defaults?: AxiosRequestConfig): AxiosInstance; createAdapter(platform: AxiosPlatform): AxiosAdapter; diff --git a/src/core/Axios.ts b/src/core/Axios.ts index 9ababd2..4a8a208 100644 --- a/src/core/Axios.ts +++ b/src/core/Axios.ts @@ -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, + '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; + /** + * 请求参数 + */ + 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; + /** + * 监听上传进度 + */ + onUploadProgress?: AxiosProgressCallback; + /** + * 监听下载进度 + */ + onDownloadProgress?: AxiosProgressCallback; + /** + * 请求参数系列化函数 + */ + paramsSerializer?: (params?: AnyObject) => string; + /** + * 校验状态码 + */ validateStatus?: (status: number) => boolean; } -export interface AxiosResponse { - status: number; - statusText: string; - headers: AxiosResponseHeaders; - data: TData; +export interface AxiosResponse + extends AxiosAdapterResponse { 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> { - return this._requestMethodWithoutParams( - 'options', - url, - undefined, - config, - ); + return this._req('options', url, undefined, config); } public get( url: string, - params?: AxiosRequestParams, + params?: AnyObject, config?: AxiosRequestConfig, ): Promise> { - return this._requestMethodWithoutParams('get', url, params, config); + return this._req('get', url, params, config); } public head( url: string, - params?: AxiosRequestParams, + params?: AnyObject, config?: AxiosRequestConfig, ): Promise> { - return this._requestMethodWithoutParams('head', url, params, config); + return this._req('head', url, params, config); } public post( url: string, - data?: AxiosRequestData | AxiosRequestFormData, + data?: AnyObject | AxiosRequestFormData, config?: AxiosRequestConfig, ): Promise> { - return this._requestMethodWithoutData('post', url, data, config); + return this._reqWithData('post', url, data, config); } public put( url: string, - data?: AxiosRequestData | AxiosRequestFormData, + data?: AnyObject | AxiosRequestFormData, config?: AxiosRequestConfig, ): Promise> { - return this._requestMethodWithoutData('put', url, data, config); + return this._reqWithData('put', url, data, config); } public delete( url: string, - params?: AxiosRequestParams, + params?: AnyObject, config?: AxiosRequestConfig, ): Promise> { - return this._requestMethodWithoutParams( - 'delete', - url, - params, - config, - ); + return this._req('delete', url, params, config); } public trace( url: string, config?: AxiosRequestConfig, ): Promise> { - return this._requestMethodWithoutParams( - 'trace', - url, - undefined, - config, - ); + return this._req('trace', url, undefined, config); } public connect( url: string, config?: AxiosRequestConfig, ): Promise> { - return this._requestMethodWithoutParams( - 'connect', - url, - undefined, - config, - ); + return this._req('connect', url, undefined, config); } - private _requestMethodWithoutParams( + private _req( method: AxiosRequestMethod, url: string, - params?: AxiosRequestParams, + params?: AnyObject, config?: AxiosRequestConfig, ): Promise> { return this.request({ @@ -240,10 +258,10 @@ export default class Axios { }); } - private _requestMethodWithoutData( + private _reqWithData( method: AxiosRequestMethod, url: string, - data?: AxiosRequestData | AxiosRequestFormData, + data?: AnyObject | AxiosRequestFormData, config?: AxiosRequestConfig, ): Promise> { return this.request({ diff --git a/src/core/transformData.ts b/src/core/transformData.ts index cd8d84e..ba0d85c 100644 --- a/src/core/transformData.ts +++ b/src/core/transformData.ts @@ -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; } diff --git a/src/defaults.ts b/src/defaults.ts index 67e8510..1e6c3b2 100644 --- a/src/defaults.ts +++ b/src/defaults.ts @@ -26,10 +26,6 @@ const defaults: AxiosRequestConfig = { timeout: 10000, dataType: 'json', responseType: 'text', - enableHttp2: false, - enableQuic: false, - enableCache: false, - sslVerify: true, }; export default defaults; diff --git a/src/index.ts b/src/index.ts index a500da1..312dfd9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,6 +8,8 @@ export type { } from './core/Axios'; export type { AxiosAdapterRequestConfig, + AxiosAdapterResponse, + AxiosAdapterResponseError, AxiosAdapter, AxiosPlatform, } from './adapter';