parseJsonResponse static method
解析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(),
);
}
}