generate static method

String generate({
  1. required String method,
  2. required String path,
  3. Map<String, dynamic>? queryParameters,
  4. dynamic data,
  5. Map<String, dynamic>? headers,
})

生成缓存键

使用稳定的序列化方式确保相同的请求参数生成相同的缓存键

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();
}