# -*- coding: utf-8 -*- """双跑对比:PHP 线上响应 vs Java 本地响应,逐字段 diff""" import json import re import sys from pathlib import Path import requests from _root import ROOT ROOT = Path(str(ROOT)) src = Path(r"F:\import goods\upload_goods.py").read_text(encoding="utf-8") token = re.search(r'TOKEN\s*=\s*"([^"]+)"', src).group(1) params = {"page": 1, "listRows": 15} php = requests.post("https://shop.qinys.cn/index.php?s=/store/goods/list", headers={"Access-Token": token}, data=params, timeout=30).json() java = json.load(open(ROOT / "golden" / "java_goods_list.json", encoding="utf-8")) php_items = php["data"]["list"]["data"] java_items = java["data"]["list"]["data"] print(f"PHP 条数: {len(php_items)} Java 条数: {len(java_items)}") php_map = {g["goods_id"]: g for g in php_items} java_map = {g["goods_id"]: g for g in java_items} print(f"PHP goods_id: {sorted(php_map)}") print(f"Java goods_id: {sorted(java_map)}") def norm(v): if isinstance(v, str): return v if isinstance(v, bool): return v return v diff_count = 0 for gid in sorted(set(php_map) & set(java_map)): p, j = php_map[gid], java_map[gid] pkeys, jkeys = set(p), set(j) for k in sorted(pkeys - jkeys): print(f"[缺字段] goods {gid} 缺少 {k}") diff_count += 1 for k in sorted(jkeys - pkeys): print(f"[多字段] goods {gid} 多出 {k}") diff_count += 1 for k in sorted(pkeys & jkeys): pv, jv = p[k], j[k] if type(pv).__name__ != type(jv).__name__: print(f"[类型] goods {gid}.{k}: PHP={type(pv).__name__}({pv!r}) Java={type(jv).__name__}({jv!r})") diff_count += 1 elif isinstance(pv, list): if json.dumps(pv, ensure_ascii=False, sort_keys=True) != json.dumps(jv, ensure_ascii=False, sort_keys=True): print(f"[值] goods {gid}.{k}:\n PHP ={json.dumps(pv, ensure_ascii=False)[:200]}\n Java={json.dumps(jv, ensure_ascii=False)[:200]}") diff_count += 1 elif pv != jv: print(f"[值] goods {gid}.{k}: PHP={pv!r} Java={jv!r}") diff_count += 1 print(f"\n差异总数: {diff_count}")