logResponse method
Log response details
Implementation
void logResponse(
Response response, {
DateTime? startTime,
DateTime? endTime,
}) {
if (!enabled) return;
final statusCode = response.statusCode;
final data = response.data;
final headers = response.headers.map;
final duration = endTime != null && startTime != null
? endTime.difference(startTime)
: null;
final method = response.requestOptions.method.toUpperCase(); // API Type
_outputLine('\n$_green┌${'─' * 58}┐$_reset');
_outputLine(
'$_green│$_bold$_green📥 API RESPONSE$_reset $_bold$_yellow[${_formatDateTime(endTime ?? DateTime.now())} | ${duration?.inMilliseconds ?? 0}ms]$_reset$_green│$_reset',
);
_outputLine('$_green└${'─' * 58}┘$_reset');
// Status and API Type
final statusEmoji = _getStatusEmoji(statusCode);
_outputLine(
'$_bold${_getStatusColor(statusCode)}Status Code:$_reset $statusCode $statusEmoji',
);
_outputLine(
'$_bold${_blue}API Type (Method):$_reset $method',
); // Display API Type
// URL
_outputLine(
'$_bold${_magenta}URL:$_reset ${response.requestOptions.uri}',
);
// Response Headers (optional - can be commented out if too verbose)
if (headers.isNotEmpty && _shouldLogHeaders()) {
_outputLine('\n$_yellow📋 Response Headers:$_reset');
headers.forEach((key, values) {
final displayValue = _maskSensitiveHeader(key, values.join(', '));
_outputLine(' $_bold$key:$_reset $displayValue');
});
}
// Response Body (full print, no truncation)
if (data != null) {
_outputLine('\n$_yellow📦 Response Body:$_reset');
if (data is Map || data is List) {
try {
final prettyJson = JsonEncoder.withIndent(' ').convert(data);
_outputPrettyJson(prettyJson); // Full output
} catch (e) {
_outputLine(data.toString());
}
} else if (data is String) {
_outputLine(data); // Full string, no truncation
} else {
_outputLine(data.toString());
}
}
_outputLine('$_green└${'─' * 60}┘$_reset\n');
}