import { WITH_DATA_RE } from '../constants/methods' import { isFunction, isString } from '../helpers/isTypes' import { assert } from '../helpers/error' import { AxiosRequestConfig, AxiosResponse } from '../core/Axios' import { Cancel, isCancel, isCancelToken } from './cancel' import { flattenHeaders } from './flattenHeaders' import { AxiosTransformer, transformData } from './transformData' import { request } from './request' import { AxiosErrorResponse } from './createError' /** * 发送请求 * * 校验配置,转换配置,转换数据,捕获取消请求。 * * @param config 请求配置 */ export function dispatchRequest(config: AxiosRequestConfig) { throwIfCancellationRequested(config) assert(isFunction(config.adapter), 'adapter 不是一个 function') assert(isString(config.url), 'url 不是一个 string') assert(isString(config.method), 'method 不是一个 string') config.headers = flattenHeaders(config) // 可以携带 data 的请求方法,转换 data // 否则,删除 data if (WITH_DATA_RE.test(config.method!)) { dataTransformer(config, config.transformRequest) } else { delete config.data } function onSuccess(response: AxiosResponse) { throwIfCancellationRequested(config) dataTransformer(response, config.transformResponse) return response } function onError(error: Cancel | AxiosErrorResponse) { if (!isCancel(error)) { throwIfCancellationRequested(config) dataTransformer(error.response, config.transformResponse) } return Promise.reject(error) } function dataTransformer( obj: { data?: TData; headers?: AnyObject }, fn?: AxiosTransformer, ) { obj.data = transformData(obj.data, obj.headers, fn) } return request(config).then(onSuccess, onError) } function throwIfCancellationRequested(config: AxiosRequestConfig) { const { cancelToken } = config if (isCancelToken(cancelToken)) { cancelToken.throwIfRequested() } }