调试:添加 IoT 回调请求详细日志,排查 body 为空问题

This commit is contained in:
2026-03-25 17:11:25 +08:00
parent 6fcd8f68bf
commit e874a35c12

View File

@@ -40,24 +40,38 @@ class SyncStatusRequest(BaseModel):
async def _parse_body(request: Request) -> dict:
"""兼容解析请求体JSON / form / query params"""
# 1. 尝试 JSON
try:
body = await request.body()
if body:
return json.loads(body)
except Exception:
pass
content_type = request.headers.get("content-type", "")
logger.info(f"IoT请求调试: method={request.method}, content-type={content_type}, url={request.url}")
# 2. 尝试 form data
try:
form = await request.form()
if form:
return dict(form)
except Exception:
pass
# 1. 读取原始 body
raw_body = await request.body()
logger.info(f"IoT请求调试: raw_body_len={len(raw_body)}, raw_body={raw_body[:500]}")
# 3. 降级到 query params
return dict(request.query_params)
# 2. 尝试 JSON 解析
if raw_body:
try:
return json.loads(raw_body)
except Exception as e:
logger.warning(f"JSON解析失败: {e}")
# 3. 尝试 form 解析(需要重新构造 body因为上面已经读过了
if raw_body and "form" in content_type:
try:
from urllib.parse import parse_qs
params = parse_qs(raw_body.decode("utf-8"))
return {k: v[0] if len(v) == 1 else v for k, v in params.items()}
except Exception as e:
logger.warning(f"Form解析失败: {e}")
# 4. 降级到 query params
qp = dict(request.query_params)
if qp:
logger.info(f"使用query params: {qp}")
return qp
# 5. 尝试从 headers 中找数据(某些客户端可能这么做)
logger.warning(f"所有解析方式均无数据headers={dict(request.headers)}")
return {}
@router.post("/send-card")