From 3848fdd81bf8fb1f5e373ca4e117adb653969acf Mon Sep 17 00:00:00 2001 From: zjxxxxxxxxx <43126836+zjxxxxxxxxx@users.noreply.github.com> Date: Wed, 1 Nov 2023 20:45:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=AC=A6=E5=90=88=20?= =?UTF-8?q?HTTP=20=E8=A7=84=E8=8C=83=E7=9A=84=20statusText=20(#49)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- docs/pages/advanced/adapter.md | 24 ----------- scripts/play.ts | 2 +- scripts/test.utils.ts | 8 ++-- src/adpater/createAdapter.ts | 10 +---- src/helpers/getHttpStatusText.ts | 68 ++++++++++++++++++++++++++++++++ src/request/request.ts | 21 +++++----- 7 files changed, 86 insertions(+), 49 deletions(-) create mode 100644 src/helpers/getHttpStatusText.ts diff --git a/README.md b/README.md index bae4643..dc22b88 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ axios-miniprogram 是一款为小程序平台量身定制的轻量级请求库 ## 关于在跨端框架中使用时的支持度 -问:在 uni-app 或者 Taro 等等这类跨端框架中使用时,该请求库支持 h5,APP,vue3,taro 等等吗? +问:在 uni-app 或者 Taro 等等这类跨端框架中使用时,该请求库支持 h5,APP,vue3 等等吗? 答:该请求库只是对框架提供的请求 API 进行了封装,并没有使用什么黑魔法。理论上来讲,框架支持的平台,该库也必然支持。 diff --git a/docs/pages/advanced/adapter.md b/docs/pages/advanced/adapter.md index 9d09f56..ba23af1 100644 --- a/docs/pages/advanced/adapter.md +++ b/docs/pages/advanced/adapter.md @@ -125,10 +125,6 @@ axios.defaults.adapter = (config) => { // 默认值:200 status: response.statusCode, - // 状态文本 - // 默认值:'OK' - statusText: 'OK', - // 响应头 // 默认值:{} headers: response.header, @@ -146,10 +142,6 @@ axios.defaults.adapter = (config) => { // 默认值:400 status: 400, - // 状态文本 - // 默认值:'Fail' - statusText: 'Fail', - // 响应头 // 默认值:{} headers: {}, @@ -180,10 +172,6 @@ axios.defaults.adapter = (config) => { // 默认值:200 status: response.statusCode, - // 状态文本 - // 默认值:'OK' - statusText: 'OK', - // 响应头 // 默认值:{} headers: response.header, @@ -198,10 +186,6 @@ axios.defaults.adapter = (config) => { // 默认值:400 status: 400, - // 状态文本 - // 默认值:'Fail' - statusText: 'Fail', - // 响应头 // 默认值:{} headers: {}, @@ -225,10 +209,6 @@ axios.defaults.adapter = (config) => { // 默认值:200 status: response.statusCode, - // 状态文本 - // 默认值:'OK' - statusText: 'OK', - // 响应头 // 默认值:{} headers: response.header, @@ -246,10 +226,6 @@ axios.defaults.adapter = (config) => { // 默认值:400 status: 400, - // 状态文本 - // 默认值:'Fail' - statusText: 'Fail', - // 响应头 // 默认值:{} headers: {}, diff --git a/scripts/play.ts b/scripts/play.ts index 59e5f90..113ce25 100644 --- a/scripts/play.ts +++ b/scripts/play.ts @@ -9,7 +9,7 @@ async function main() { const { framework } = await enquirer.prompt<{ framework: string }>({ type: 'select', name: 'framework', - message: '请选择多端框架', + message: '请选择跨端框架', choices: readdirSync(resolve('examples')).filter((i) => i !== '.DS_Store'), }); diff --git a/scripts/test.utils.ts b/scripts/test.utils.ts index f97c96b..dc42674 100644 --- a/scripts/test.utils.ts +++ b/scripts/test.utils.ts @@ -29,13 +29,11 @@ export function noop() { export function mockResponse( status = 200, - statusText = 'OK', headers: AnyObject = {}, data: AnyObject = {}, ) { return { status, - statusText, headers, data, }; @@ -72,13 +70,13 @@ function mockAdapterBase( if (!canceled) { switch (type) { case 'success': - config.success(mockResponse(200, 'OK', headers, data)); + config.success(mockResponse(200, headers, data)); break; case 'error': - config.success(mockResponse(500, 'ERROR', headers, data)); + config.success(mockResponse(500, headers, data)); break; case 'fail': - config.fail(mockResponse(400, 'FAIL', headers, data)); + config.fail(mockResponse(400, headers, data)); break; } diff --git a/src/adpater/createAdapter.ts b/src/adpater/createAdapter.ts index 7f2ee2f..c04e762 100644 --- a/src/adpater/createAdapter.ts +++ b/src/adpater/createAdapter.ts @@ -44,10 +44,6 @@ export interface AxiosAdapterResponse extends AnyObject { * 状态码 */ status?: number; - /** - * 状态字符 - */ - statusText?: string; /** * 响应头 */ @@ -66,10 +62,6 @@ export interface AxiosAdapterResponseError extends AnyObject { * 状态码 */ status?: number; - /** - * 状态字符 - */ - statusText?: string; /** * 响应头 */ @@ -344,6 +336,7 @@ export function createAdapter(platform: AxiosAdapterPlatform) { ): AxiosAdapterPlatformTask { const options = baseOptions as AxiosAdapterDownloadOptions; const { params, success } = options; + options.filePath = params?.filePath; options.success = (_response) => { const response = Object.assign( @@ -375,6 +368,7 @@ export function createAdapter(platform: AxiosAdapterPlatform) { ): AxiosAdapterPlatformTask { const options = baseOptions as AxiosAdapterUploadOptions; const { name, filePath, fileType, ...formData } = options.data as AnyObject; + options.name = name; options.filePath = filePath; options.formData = formData; diff --git a/src/helpers/getHttpStatusText.ts b/src/helpers/getHttpStatusText.ts new file mode 100644 index 0000000..d25e87f --- /dev/null +++ b/src/helpers/getHttpStatusText.ts @@ -0,0 +1,68 @@ +const httpStatusCodes = { + 100: 'Continue', + 101: 'Switching Protocols', + 102: 'Processing', + 103: 'Early Hints', + 200: 'OK', + 201: 'Created', + 202: 'Accepted', + 203: 'Non-Authoritative Information', + 204: 'No Content', + 205: 'Reset Content', + 206: 'Partial Content', + 207: 'Multi-Status', + 208: 'Already Reported', + 226: 'IM Used', + 300: 'Multiple Choices', + 301: 'Moved Permanently', + 302: 'Found', + 303: 'See Other', + 304: 'Not Modified', + 307: 'Temporary Redirect', + 308: 'Permanent Redirect', + 400: 'Bad Request', + 401: 'Unauthorized', + 402: 'Payment Required', + 403: 'Forbidden', + 404: 'Not Found', + 405: 'Method Not Allowed', + 406: 'Not Acceptable', + 407: 'Proxy Authentication Required', + 408: 'Request Timeout', + 409: 'Conflict', + 410: 'Gone', + 411: 'Length Required', + 412: 'Precondition Failed', + 413: 'Content Too Large', + 414: 'URI Too Long', + 415: 'Unsupported Media Type', + 416: 'Range Not Satisfiable', + 417: 'Expectation Failed', + 418: "I'm a teapot", + 421: 'Misdirected Request', + 422: 'Unprocessable Content', + 423: 'Locked', + 424: 'Failed Dependency', + 425: 'Too Early', + 426: 'Upgrade Required', + 428: 'Precondition Required', + 429: 'Too Many Requests', + 431: 'Request Header Fields Too Large', + 451: 'Unavailable For Legal Reasons', + 500: 'Internal Server Error', + 501: 'Not Implemented', + 502: 'Bad Gateway', + 503: 'Service Unavailable', + 504: 'Gateway Timeout', + 505: 'HTTP Version Not Supported', + 506: 'Variant Also Negotiates', + 507: 'Insufficient Storage', + 508: 'Loop Detected', + 510: 'Not Extended', + 511: 'Network Authentication Required', +} as const; + +export function getHttpStatusText(status: number) { + // @ts-ignore + return httpStatusCodes[status] || 'Unknown'; +} diff --git a/src/request/request.ts b/src/request/request.ts index 124e32a..9cab4da 100644 --- a/src/request/request.ts +++ b/src/request/request.ts @@ -1,5 +1,6 @@ import { isFunction, isPlainObject } from '../helpers/types'; import { transformURL } from '../helpers/transformURL'; +import { getHttpStatusText } from '../helpers/getHttpStatusText'; import { AxiosRequestConfig, AxiosResponse, @@ -46,11 +47,11 @@ export function request(config: AxiosRequestConfig) { console.error(err); } - function success(baseResponse: AxiosAdapterResponse): void { - const response = baseResponse as AxiosResponse; - response.status = response.status ?? 200; - response.statusText = response.statusText ?? 'OK'; - response.headers = response.headers ?? {}; + function success(rawResponse: AxiosAdapterResponse): void { + const response = rawResponse as AxiosResponse; + response.status ||= 200; + response.statusText ||= getHttpStatusText(response.status); + response.headers ||= {}; response.config = config; response.request = adapterTask; @@ -62,12 +63,12 @@ export function request(config: AxiosRequestConfig) { } } - function fail(baseResponseError: AxiosAdapterResponseError): void { - const responseError = baseResponseError as AxiosResponseError; + function fail(rawResponseError: AxiosAdapterResponseError): void { + const responseError = rawResponseError as AxiosResponseError; responseError.isFail = true; - responseError.status = responseError.status ?? 400; - responseError.statusText = responseError.statusText ?? 'Fail'; - responseError.headers = responseError.headers ?? {}; + responseError.status ||= 400; + responseError.statusText ||= getHttpStatusText(responseError.status); + responseError.headers ||= {}; responseError.config = config; responseError.request = adapterTask;