fix: request download and upload not support responseReturn (#5456)

* fix: request download and upload not support `responseReturn`

* docs: update

* fix: type of request client upload result
This commit is contained in:
Netfan
2025-01-22 00:59:10 +08:00
committed by GitHub
parent 195ceec9b4
commit e225159cce
7 changed files with 93 additions and 28 deletions

View File

@@ -31,6 +31,7 @@ describe('fileDownloader', () => {
expect(result).toEqual(mockBlob);
expect(mockAxiosInstance.get).toHaveBeenCalledWith(url, {
responseType: 'blob',
responseReturn: 'body',
});
});
@@ -51,6 +52,7 @@ describe('fileDownloader', () => {
expect(mockAxiosInstance.get).toHaveBeenCalledWith(url, {
...customConfig,
responseType: 'blob',
responseReturn: 'body',
});
});

View File

@@ -1,7 +1,14 @@
import type { AxiosRequestConfig } from 'axios';
import type { RequestClient } from '../request-client';
import type { RequestResponse } from '../types';
import type { RequestClientConfig } from '../types';
type DownloadRequestConfig = {
/**
* 定义期望获得的数据类型。
* raw: 原始的AxiosResponse包括headers、status等。
* body: 只返回响应数据的BODY部分(Blob)
*/
responseReturn?: 'body' | 'raw';
} & Omit<RequestClientConfig, 'responseReturn'>;
class FileDownloader {
private client: RequestClient;
@@ -9,20 +16,23 @@ class FileDownloader {
constructor(client: RequestClient) {
this.client = client;
}
public async download(
/**
* 下载文件
* @param url 文件的完整链接
* @param config 配置信息,可选。
* @returns 如果config.responseReturn为'body'则返回Blob(默认)否则返回RequestResponse<Blob>
*/
public async download<T = Blob>(
url: string,
config?: AxiosRequestConfig,
): Promise<RequestResponse<Blob>> {
const finalConfig: AxiosRequestConfig = {
config?: DownloadRequestConfig,
): Promise<T> {
const finalConfig: DownloadRequestConfig = {
responseReturn: 'body',
...config,
responseType: 'blob',
};
const response = await this.client.get<RequestResponse<Blob>>(
url,
finalConfig,
);
const response = await this.client.get<T>(url, finalConfig);
return response;
}

View File

@@ -1,6 +1,5 @@
import type { AxiosRequestConfig, AxiosResponse } from 'axios';
import type { RequestClient } from '../request-client';
import type { RequestClientConfig } from '../types';
class FileUploader {
private client: RequestClient;
@@ -9,18 +8,18 @@ class FileUploader {
this.client = client;
}
public async upload(
public async upload<T = any>(
url: string,
data: Record<string, any> & { file: Blob | File },
config?: AxiosRequestConfig,
): Promise<AxiosResponse> {
config?: RequestClientConfig,
): Promise<T> {
const formData = new FormData();
Object.entries(data).forEach(([key, value]) => {
formData.append(key, value);
});
const finalConfig: AxiosRequestConfig = {
const finalConfig: RequestClientConfig = {
...config,
headers: {
'Content-Type': 'multipart/form-data',

View File

@@ -25,15 +25,15 @@ export const defaultResponseInterceptor = ({
if (config.responseReturn === 'raw') {
return response;
}
const code = responseData[codeField];
if (
status >= 200 && status < 400 && isFunction(successCode)
? successCode(code)
: code === successCode
) {
if (status >= 200 && status < 400) {
if (config.responseReturn === 'body') {
return responseData;
} else {
} else if (
isFunction(successCode)
? successCode(responseData[codeField])
: responseData[codeField] === successCode
) {
return isFunction(dataField)
? dataField(responseData)
: responseData[dataField];

View File

@@ -7,9 +7,9 @@ import type {
type ExtendOptions = {
/** 响应数据的返回方式。
* raw: 原始的AxiosResponse包括headers、status等。
* body: 返回响应数据的BODY部分。
* data: 解构响应的BODY数据只返回其中的data节点数据。
* raw: 原始的AxiosResponse包括headers、status等,不做是否成功请求的检查
* body: 返回响应数据的BODY部分只会根据status检查请求是否成功忽略对code的判断这种情况下应由调用方检查请求是否成功
* data: 解构响应的BODY数据只返回其中的data节点数据会检查status和code是否为成功状态
*/
responseReturn?: 'body' | 'data' | 'raw';
};