dispatchRequest
dispatchRequest.js 是 Axios 中真正发送请求的核心实现,位于 lib/core/dispatchRequest.js。
主要做了以下操作:
- 使用
AxiosHeaders 处理请求头。
- 使用
transformData 对请求数据进行转换。
- 处理 [POST、PUT、PATCH] 请求的 Content-Type。
- 调用适配器发送请求。
- 处理响应成功数据。
- 处理非取消请求错误数据。
源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| 'use strict';
import transformData from './transformData.js'; import isCancel from '../cancel/isCancel.js'; import defaults from '../defaults/index.js'; import CanceledError from '../cancel/CanceledError.js'; import AxiosHeaders from '../core/AxiosHeaders.js'; import adapters from '../adapters/adapters.js';
function throwIfCancellationRequested(config) { if (config.cancelToken) { config.cancelToken.throwIfRequested(); }
if (config.signal && config.signal.aborted) { throw new CanceledError(null, config); } }
export default function dispatchRequest(config) { throwIfCancellationRequested(config); config.headers = AxiosHeaders.from(config.headers);
config.data = transformData.call(config, config.transformRequest);
if (['post', 'put', 'patch'].indexOf(config.method) !== -1) { config.headers.setContentType('application/x-www-form-urlencoded', false); }
const adapter = adapters.getAdapter(config.adapter || defaults.adapter, config);
return adapter(config).then( function onAdapterResolution(response) { throwIfCancellationRequested(config);
config.response = response; try { response.data = transformData.call(config, config.transformResponse, response); } finally { delete config.response; }
response.headers = AxiosHeaders.from(response.headers);
return response; }, function onAdapterRejection(reason) { if (!isCancel(reason)) { throwIfCancellationRequested(config);
if (reason && reason.response) { config.response = reason.response; try { reason.response.data = transformData.call( config, config.transformResponse, reason.response ); } finally { delete config.response; } reason.response.headers = AxiosHeaders.from(reason.response.headers); } }
return Promise.reject(reason); } ); }
|