parseJsonResponse static method

Map<String, dynamic> parseJsonResponse(
  1. Response response
)

解析JSON响应,并处理常见错误

Implementation

static Map<String, dynamic> parseJsonResponse(http.Response response) {
  // 检查响应内容类型
  final contentType = response.headers['content-type'] ?? '';
  final isHtml = contentType.toLowerCase().contains('text/html');

  // 处理404错误
  if (response.statusCode == 404) {
    // 如果返回的是HTML(通常是错误页面),不尝试解析
    if (isHtml) {
      if (kDebugMode) {
        print('$_logTag ⚠️ 404 returned HTML error page instead of JSON');
      }
    }
    throw NetworkException(
      statusCode: 404,
      message: _i18n.get('network_error_404'),
      userMessage: _i18n.get('network_error_404_user'),
      originalError: 'API endpoint not found',
    );
  }

  // 处理401未授权
  if (response.statusCode == 401) {
    throw NetworkException(
      statusCode: 401,
      message: _i18n.get('network_error_401'),
      userMessage: _i18n.get('network_error_401_user'),
      originalError: 'Unauthorized',
    );
  }

  // 处理403禁止访问
  if (response.statusCode == 403) {
    throw NetworkException(
      statusCode: 403,
      message: _i18n.get('network_error_403'),
      userMessage: _i18n.get('network_error_403_user'),
      originalError: 'Forbidden',
    );
  }

  // 处理500服务器错误
  if (response.statusCode == 500) {
    throw NetworkException(
      statusCode: 500,
      message: _i18n.get('network_error_500'),
      userMessage: _i18n.get('network_error_500_user'),
      originalError: 'Internal Server Error',
    );
  }

  // 处理503服务不可用
  if (response.statusCode == 503) {
    throw NetworkException(
      statusCode: 503,
      message: _i18n.get('network_error_503'),
      userMessage: _i18n.get('network_error_503_user'),
      originalError: 'Service Unavailable',
    );
  }

  // 处理其他非200状态码
  if (response.statusCode != 200) {
    // 如果是HTML错误页面,提供更友好的提示
    if (isHtml) {
      if (kDebugMode) {
        print('$_logTag ⚠️ ${response.statusCode} returned HTML error page instead of JSON');
      }
    }
    throw NetworkException(
      statusCode: response.statusCode,
      message: _i18n.get('network_error_general'),
      userMessage: _i18n.get('network_error_general_user'),
      originalError: 'HTTP ${response.statusCode}',
    );
  }

  // 检查响应是否是JSON
  if (isHtml) {
    throw NetworkException(
      statusCode: response.statusCode,
      message: _i18n.get('network_error_format'),
      userMessage: _i18n.get('network_error_format_user'),
      originalError: 'Expected JSON but got HTML',
    );
  }

  try {
    return json.decode(utf8.decode(response.bodyBytes)) as Map<String, dynamic>;
  } catch (e) {
    throw NetworkException(
      statusCode: response.statusCode,
      message: _i18n.get('network_error_json'),
      userMessage: _i18n.get('network_error_json_user'),
      originalError: e.toString(),
    );
  }
}