request_preparer.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import loguru
  2. from typing import Dict, Any
  3. from core.utils.extractors import safe_extract
  4. class RequestPreparer:
  5. """
  6. 动态准备请求体:
  7. - 支持 {{var_name}} 动态占位符
  8. - 自动从上次响应根据 response_parse 配置提取对应值
  9. - 无值时使用空字符串
  10. - 可选日志记录提取失败情况
  11. """
  12. def __init__(self, response_parse_config: Dict[str, str], logger=None, aliyun_log=None):
  13. """
  14. :param response_parse_config: 如 {"next_cursor": "$.data.next_cursor"}
  15. :param logger: 可选 logger
  16. :param aliyun_log: 可选阿里云日志实例
  17. """
  18. self.response_parse_config = response_parse_config or {}
  19. self.logger = logger or loguru.logger
  20. self.aliyun_log = aliyun_log
  21. def prepare(self, request_body_config: Dict[str, Any], response_data: Dict[str, Any]) -> Dict[str, Any]:
  22. """
  23. 根据 request_body_config 和上次响应 response_data,返回可直接请求接口的 request_body
  24. """
  25. if not request_body_config:
  26. return {}
  27. prepared_body = {}
  28. for key, value in request_body_config.items():
  29. if isinstance(value, str) and "{{" in value and "}}" in value:
  30. # 提取变量名(支持后续扩展默认值)
  31. var_name = value.strip("{}").split("|")[0]
  32. jsonpath_expr = self.response_parse_config.get(var_name)
  33. if jsonpath_expr:
  34. extracted_value = safe_extract(response_data, jsonpath_expr, default="")
  35. prepared_body[key] = extracted_value
  36. # 记录提取信息(仅在有日志记录器时)
  37. if extracted_value == "" and self.logger:
  38. self.logger.debug(f"变量 {var_name} 提取结果为空,使用默认值")
  39. else:
  40. # response_parse_config 中未配置路径,默认空字符串
  41. prepared_body[key] = ""
  42. # 记录警告信息
  43. if self.logger:
  44. self.logger.warning(f"未在response_parse_config中找到变量 {var_name} 的路径配置")
  45. else:
  46. prepared_body[key] = value
  47. return prepared_body
  48. if __name__ == "__main__":
  49. # ===== 示例运行观察效果 =====
  50. request_body_config = {
  51. "cursor": "{{next_cursor}}",
  52. "category": "recommend",
  53. "flag": "{{flag}}"
  54. }
  55. response_parse_config = {
  56. "next_cursor": "$.data.next_cursor",
  57. "flag": "$.data.flag"
  58. }
  59. # 模拟响应
  60. response_data = {
  61. "data": {
  62. "next_cursor": "abc123",
  63. "flag": "on"
  64. }
  65. }
  66. preparer = RequestPreparer(response_parse_config)
  67. prepared_body = preparer.prepare(request_body_config, response_data)
  68. print("准备好的请求体:", prepared_body)
  69. # 输出: {'cursor': 'abc123', 'category': 'recommend', 'flag': 'on'}
  70. # 测试首次请求情况
  71. prepared_body_first = preparer.prepare(request_body_config, {})
  72. print("首次请求时请求体:", prepared_body_first)
  73. # 输出: {'cursor': '', 'category': 'recommend', 'flag': ''}