generate static method
生成缓存键
使用稳定的序列化方式确保相同的请求参数生成相同的缓存键
method HTTP方法(GET、POST等)
path 请求路径
queryParameters URL查询参数
data 请求体数据
headers 可选的请求头(某些API根据请求头返回不同内容)
Implementation
static String generate({
required String method,
required String path,
Map<String, dynamic>? queryParameters,
dynamic data,
Map<String, dynamic>? headers,
}) {
final buffer = StringBuffer('$method:$path');
// 处理查询参数 - 按key排序确保稳定性
if (queryParameters != null && queryParameters.isNotEmpty) {
final sortedKeys = queryParameters.keys.toList()..sort();
buffer.write(':query=');
for (final key in sortedKeys) {
buffer.write('$key=${queryParameters[key]}&');
}
}
// 处理请求体数据 - 使用稳定的JSON序列化
if (data != null) {
try {
String dataStr;
if (data is Map) {
// 对Map进行排序后序列化
dataStr = _serializeMap(data);
} else if (data is List) {
dataStr = jsonEncode(data);
} else if (data is String) {
dataStr = data;
} else {
// 其他类型转为字符串
dataStr = data.toString();
}
final bytes = utf8.encode(dataStr);
// 缩短长度,同时保持唯一性
final shortBytes = bytes.sublist(0, 10);
buffer.write(':data=${base64.encode(shortBytes)}');
} catch (e) {
// 如果序列化失败,回退到字符串表示
buffer.write(':data=${data.toString()}');
}
}
// 处理影响响应的关键请求头(如Accept-Language, Accept等)
if (headers != null && headers.isNotEmpty) {
final importantHeaders = ['Accept', 'Accept-Language', 'Accept-Encoding'];
final relevantHeaders = <String, dynamic>{};
for (final key in importantHeaders) {
if (headers.containsKey(key)) {
relevantHeaders[key] = headers[key];
}
}
if (relevantHeaders.isNotEmpty) {
final sortedKeys = relevantHeaders.keys.toList()..sort();
buffer.write(':headers=');
for (final key in sortedKeys) {
buffer.write('$key=${relevantHeaders[key]};');
}
}
}
return buffer.toString();
}