|
@@ -2,9 +2,48 @@ import type { RequestClient } from './request-client';
|
|
|
import type { MakeErrorMessageFn, ResponseInterceptorConfig } from './types';
|
|
|
|
|
|
import { $t } from '@vben/locales';
|
|
|
+import { isFunction } from '@vben/utils';
|
|
|
|
|
|
import axios from 'axios';
|
|
|
|
|
|
+export const defaultResponseInterceptor = ({
|
|
|
+ codeField = 'code',
|
|
|
+ dataField = 'data',
|
|
|
+ successCode = 0,
|
|
|
+}: {
|
|
|
+ /** 响应数据中代表访问结果的字段名 */
|
|
|
+ codeField: string;
|
|
|
+ /** 响应数据中装载实际数据的字段名,或者提供一个函数从响应数据中解析需要返回的数据 */
|
|
|
+ dataField: ((response: any) => any) | string;
|
|
|
+ /** 当codeField所指定的字段值与successCode相同时,代表接口访问成功。如果提供一个函数,则返回true代表接口访问成功 */
|
|
|
+ successCode: ((code: any) => boolean) | number | string;
|
|
|
+}): ResponseInterceptorConfig => {
|
|
|
+ return {
|
|
|
+ fulfilled: (response) => {
|
|
|
+ const { config, data: responseData, status } = response;
|
|
|
+
|
|
|
+ if (config.responseReturn === 'raw') {
|
|
|
+ return response;
|
|
|
+ }
|
|
|
+ const code = responseData[codeField];
|
|
|
+ if (
|
|
|
+ status >= 200 && status < 400 && isFunction(successCode)
|
|
|
+ ? successCode(code)
|
|
|
+ : code === successCode
|
|
|
+ ) {
|
|
|
+ if (config.responseReturn === 'body') {
|
|
|
+ return responseData;
|
|
|
+ } else {
|
|
|
+ return isFunction(dataField)
|
|
|
+ ? dataField(responseData)
|
|
|
+ : responseData[dataField];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ throw Object.assign({}, response, { response });
|
|
|
+ },
|
|
|
+ };
|
|
|
+};
|
|
|
+
|
|
|
export const authenticateResponseInterceptor = ({
|
|
|
client,
|
|
|
doReAuthenticate,
|