user
Yann authored at 2025-07-01 13:49:14
5.10 KiB
cube-front
# API 响应处理工具使用指南 ## 概述 本项目已统一了 API 响应处理逻辑,包括: 1. 统一请求参数的默认分页值(pageSize=10, pageIndex=1) 2. 标准化响应数据处理(成功/失败提示、traceId输出、分页数据处理等) 3. 提供便捷的工具函数简化开发 ## 标准 API 响应格式 ```typescript { "code": 0, // 0或200表示成功 "message": "操作成功", // 提示消息,可能为null "data": {...}, // 响应数据,可能是对象、数组、基本类型或null "traceId": "abc123", // 链路追踪ID,可能为null或空字符串 "page": { // 分页信息,可能为null "pageIndex": 1, "pageSize": 10, "totalCount": 189, "longTotalCount": "189" }, "stat": {...} // 统计信息,可能为null } ``` ## 使用方式 ### 1. 基础 API 调用 ```typescript import { request } from '@/core/utils/request'; import { handleApiResponse, type ApiResponse } from '@/core/utils/response'; // 定义响应数据类型 interface UserInfo { id: number; name: string; email: string; } // API 调用 async function getUserInfo(userId: number) { try { const response = await request.get<ApiResponse<UserInfo>>(`/api/user/${userId}`); // 使用统一响应处理 const result = handleApiResponse(response.data); if (result.success) { console.log('用户信息:', result.data); return result.data; } else { console.error('获取用户信息失败:', result.message); return null; } } catch (error) { console.error('请求失败:', error); return null; } } ``` ### 2. 使用 API 包装器(推荐) ```typescript import { createApiWrapper } from '@/core/utils/response'; // 创建包装后的API函数 const getUserInfoApi = createApiWrapper( async (userId: number) => { const response = await request.get<ApiResponse<UserInfo>>(`/api/user/${userId}`); return response.data; }, { showSuccessMessage: false, // 不显示成功提示 showErrorMessage: true, // 显示错误提示 } ); // 使用 async function loadUserInfo(userId: number) { const result = await getUserInfoApi(userId); if (result.success) { // 自动处理了提示消息和traceId输出 return result.data; } return null; } ``` ### 3. 分页 API 调用 ```typescript import { createPageApiWrapper, normalizePageParams } from '@/core/utils/response'; interface UserListParams { keyword?: string; status?: number; pageIndex?: number; pageSize?: number; } // 创建分页API包装器 const getUserListApi = createPageApiWrapper( async (params: UserListParams & Required<PageParams>) => { const response = await request.get<ApiResponse<UserInfo[]>>('/api/users', { params }); return response.data; } ); // 使用 - 会自动设置默认分页参数 async function loadUserList(params: UserListParams = {}) { const result = await getUserListApi(params); if (result.success) { return { data: result.data, page: result.page, // 分页信息 stat: result.stat, // 统计信息 }; } return null; } ``` ### 4. DataSet 中的使用 DataSet 已经内置了分页参数的处理,会自动添加 pageSize=10 和 pageIndex=1 的默认值。 ```typescript import { DataSet } from '@/core/dataset'; const userDataSet = new DataSet<UserInfo, UserListParams>({ transport: { read: ({ params }) => ({ url: '/api/users', method: 'GET', params: params, // 已自动包含 pageSize 和 pageIndex }), }, // 其他配置... }); // 使用 await userDataSet.query({ keyword: 'test' }); ``` ### 5. 手动处理响应 如果需要更精细的控制,可以直接使用工具函数: ```typescript import { isApiSuccess, extractResponseData, extractPageInfo } from '@/core/utils/response'; async function customApiCall() { const response = await request.get<ApiResponse<UserInfo[]>>('/api/users'); const apiResponse = response.data; // 检查是否成功 if (isApiSuccess(apiResponse)) { // 提取数据 const data = extractResponseData(apiResponse); // 提取分页信息 const pageInfo = extractPageInfo(apiResponse); // 处理 traceId if (apiResponse.traceId) { console.log('TraceId:', apiResponse.traceId); } return { data, pageInfo }; } return null; } ``` ## 自动处理的功能 1. **成功提示**: 当 code=0 或 code=200 且 message 不为空时,自动显示成功提示 2. **错误提示**: 当 code 不等于 0 且不等于 200 时,自动显示错误提示 3. **TraceId 输出**: 自动输出 traceId 到控制台(如果存在) 4. **分页参数标准化**: 自动设置默认的 pageSize=10 和 pageIndex=1 5. **空值处理**: 自动处理 null、undefined 和空对象的情况 ## 注意事项 1. 请求已经在 `request.ts` 中集成了响应处理逻辑,会自动显示提示消息 2. 如果使用包装器,可以通过配置项控制是否显示提示 3. 所有分页请求都会自动添加默认的分页参数 4. TraceId 会自动输出到控制台,用于问题排查