request_preparer.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import loguru
  2. from core.utils.extractors import safe_extract
  3. from typing import Dict, Any
  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
  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. prepared_body = {}
  26. for key, value in request_body_config.items():
  27. if isinstance(value, str) and "{{" in value and "}}" in value:
  28. var_name = value.strip("{}").split("|")[0] # 支持后续扩展默认值
  29. jsonpath_expr = self.response_parse_config.get(var_name)
  30. if jsonpath_expr:
  31. extracted_value = safe_extract(response_data, jsonpath_expr, default="")
  32. prepared_body[key] = extracted_value
  33. else:
  34. # response_parse_config 中未配置路径,默认空字符串
  35. prepared_body[key] = ""
  36. else:
  37. prepared_body[key] = value
  38. return prepared_body
  39. if __name__ == "__main__":
  40. # ===== 示例运行观察效果 =====
  41. request_body_config = {
  42. "cursor": "{{next_cursor}}",
  43. "category": "recommend",
  44. "flag": "{{flag}}"
  45. }
  46. response_parse_config = {
  47. "next_cursor": "$.data.next_cursor",
  48. "flag": "$.data.flag"
  49. }
  50. # 模拟响应
  51. response_data = {
  52. "data": {
  53. "next_cursor": "abc123",
  54. "flag": "on"
  55. }
  56. }
  57. preparer = RequestPreparer(response_parse_config)
  58. prepared_body = preparer.prepare(request_body_config, response_data)
  59. print("准备好的请求体:", prepared_body)
  60. # 输出: {'cursor': 'abc123', 'category': 'recommend', 'flag': 'on'}
  61. # 测试首次请求情况
  62. prepared_body_first = preparer.prepare(request_body_config, {})
  63. print("首次请求时请求体:", prepared_body_first)
  64. # 输出: {'cursor': '', 'category': 'recommend', 'flag': ''}