ApiResponseParser.ets 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import { LogHelper } from '../log/LogHelper';
  2. import { Result } from './ApiBaseRepository';
  3. /**
  4. * API 通用响应结构
  5. */
  6. export interface ApiCommonResult<T> {
  7. code: number;
  8. data: T;
  9. msg: string;
  10. }
  11. /**
  12. * API 响应解析器
  13. *
  14. * 统一处理 API 响应格式,自动解析 code、data、msg
  15. * 统一错误处理和业务错误码处理
  16. *
  17. * 使用方式:
  18. * ```typescript
  19. * const response = await networkManager.post<ApiCommonResult<UserInfo>>(url, data);
  20. * const result = ApiResponseParser.handleResponse(response, "获取用户信息失败");
  21. * if (result.isSuccess) {
  22. * const userInfo = result.getOrThrow();
  23. * }
  24. * ```
  25. */
  26. export class ApiResponseParser {
  27. /**
  28. * 成功状态码(根据实际后端定义调整)
  29. */
  30. private static readonly SUCCESS_CODE = 0;
  31. /**
  32. * 处理 API 响应
  33. *
  34. * @param response API 响应(ApiCommonResult 格式)
  35. * @param errorMessage 错误消息前缀
  36. * @param tag 日志标签
  37. * @returns Result<T>
  38. */
  39. static handleResponse<T>(
  40. response: ApiCommonResult<T>,
  41. errorMessage: string = '请求失败',
  42. tag: string = 'ApiResponseParser'
  43. ): Result<T> {
  44. if (response.code === ApiResponseParser.SUCCESS_CODE) {
  45. if (response.data !== undefined && response.data !== null) {
  46. LogHelper.d(tag, '请求成功');
  47. return Result.success(response.data);
  48. } else {
  49. const error = new Error('响应数据为空');
  50. LogHelper.e(tag, `${errorMessage}: 响应数据为空`);
  51. return Result.failure(error);
  52. }
  53. } else {
  54. const errorMsg = response.msg || errorMessage;
  55. const error = new Error(errorMsg);
  56. LogHelper.e(tag, `${errorMessage}: ${errorMsg} (code: ${response.code})`);
  57. return Result.failure(error);
  58. }
  59. }
  60. /**
  61. * 处理可空数据的 API 响应
  62. *
  63. * 用于处理服务器可能返回 null 的情况
  64. *
  65. * @param response API 响应
  66. * @param errorMessage 错误消息前缀
  67. * @param tag 日志标签
  68. * @returns Result<T | null>
  69. */
  70. static handleNullableResponse<T>(
  71. response: ApiCommonResult<T>,
  72. errorMessage: string = '请求失败',
  73. tag: string = 'ApiResponseParser'
  74. ): Result<T | null> {
  75. if (response.code === ApiResponseParser.SUCCESS_CODE) {
  76. LogHelper.d(tag, '请求成功(可空数据)');
  77. return Result.success(response.data ?? null);
  78. } else {
  79. const errorMsg = response.msg || errorMessage;
  80. const error = new Error(errorMsg);
  81. LogHelper.e(tag, `${errorMessage}: ${errorMsg} (code: ${response.code})`);
  82. return Result.failure(error);
  83. }
  84. }
  85. /**
  86. * 检查响应是否成功
  87. */
  88. static isSuccess<T>(response: ApiCommonResult<T>): boolean {
  89. return response.code === ApiResponseParser.SUCCESS_CODE;
  90. }
  91. /**
  92. * 获取错误消息
  93. */
  94. static getErrorMessage<T>(response: ApiCommonResult<T>, defaultMessage: string = '请求失败'): string {
  95. return response.msg || defaultMessage;
  96. }
  97. }