From 4bf7ee9988e1c27851f128a8d8d2a3d8db4952a2 Mon Sep 17 00:00:00 2001 From: gongwenxin Date: Fri, 8 Aug 2025 14:31:29 +0800 Subject: [PATCH] fix:domain map --- ddms_compliance_suite/api_caller/caller.py | 15 ++++++++++- ddms_compliance_suite/input_parser/parser.py | 27 +++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/ddms_compliance_suite/api_caller/caller.py b/ddms_compliance_suite/api_caller/caller.py index 970b504..f20aff6 100644 --- a/ddms_compliance_suite/api_caller/caller.py +++ b/ddms_compliance_suite/api_caller/caller.py @@ -117,9 +117,18 @@ class APICaller: - An APICallDetail Pydantic model instance. """ merged_headers = {**self.default_headers, **(request_data.headers or {})} + + # 🔧 移除User-Agent头(DMS API不需要) + if 'User-Agent' in merged_headers: + del merged_headers['User-Agent'] + timeout = request_data.timeout or self.default_timeout json_payload = request_data.json_data + # 🔧 确保POST请求有空对象body(如果没有提供json_data) + if request_data.method.upper() == 'POST' and json_payload is None and request_data.data is None: + json_payload = {} # 空对象 + # Generate cURL command before making the request curl_command = self._generate_curl_command(request_data, merged_headers) @@ -130,7 +139,11 @@ class APICaller: request_body_for_log = request_data.data # Store as is, might be dict or str try: - response = requests.request( + # 🔧 创建session并禁用默认User-Agent + session = requests.Session() + session.headers.clear() # 清除所有默认头 + + response = session.request( method=request_data.method.upper(), url=str(request_data.url), headers=merged_headers, diff --git a/ddms_compliance_suite/input_parser/parser.py b/ddms_compliance_suite/input_parser/parser.py index c7fd630..fd101ee 100644 --- a/ddms_compliance_suite/input_parser/parser.py +++ b/ddms_compliance_suite/input_parser/parser.py @@ -554,6 +554,16 @@ class InputParser: except (FileNotFoundError, json.JSONDecodeError) as e: self.logger.warning(f"Could not load or parse domain map file '{domain_mapping_path}'. Using default domain. Error: {e}") DOMAIN_MAP = {} + + # 🔧 构建关键词到领域ID的映射表 + keyword_to_domain_id = {} + for domain_id, domain_info in DOMAIN_MAP.items(): + if isinstance(domain_info, dict) and 'keywords' in domain_info: + keywords = domain_info['keywords'] + if isinstance(keywords, list): + for keyword in keywords: + keyword_to_domain_id[keyword] = domain_id + self.logger.debug(f"映射关键词 '{keyword}' -> 领域ID '{domain_id}'") list_url = urljoin(base_url, "/api/schema/manage/schema") self.logger.info(f"Fetching API list from: {list_url}") @@ -591,7 +601,22 @@ class InputParser: self.logger.warning(f"Skipping an item in API list because it's missing 'domain', 'name', or 'id': {item}") continue - instance_code = DOMAIN_MAP.get(domain_name, domain_name) + # 🔧 改进领域映射:支持精确匹配和前缀匹配 + instance_code = keyword_to_domain_id.get(domain_name) + if instance_code: + self.logger.info(f"通过精确关键词匹配:'{domain_name}' -> '{instance_code}'") + else: + # 尝试前缀匹配(如wb_cd匹配wb) + for keyword, domain_id in keyword_to_domain_id.items(): + if domain_name.startswith(keyword + '_'): # wb_cd以wb_开头 + instance_code = domain_id + self.logger.info(f"通过前缀关键词匹配:'{domain_name}' -> '{instance_code}' (匹配关键词: '{keyword}')") + break + + if not instance_code: + # Fallback到原有的直接映射 + instance_code = DOMAIN_MAP.get(domain_name, domain_name) + self.logger.info(f"使用直接映射:'{domain_name}' -> '{instance_code}'") model_url = urljoin(base_url, f"/api/schema/manage/schema/{model_id}") self.logger.info(f"Fetching model for '{name}' from: {model_url}")