必须直接查看Network面板原始响应体,区分六种“空”类型:①204无body;②200+空字符串;③200+data为null;④200+data为空数组;⑤200+content为空;⑥解析路径错误。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

调试智谱清言接口时发现返回数据结构混乱、字段缺失或解析失败,必须跳过日志猜测,直接从原始响应体出发,逐层验证HTTP状态码、业务码、JSON路径和前端取值逻辑是否匹配。
确认空响应的真实类型
打开浏览器开发者工具 → Network标签页 → 找到对应请求 → 点击查看 → 切换到Response或Preview选项卡。不要只看控制台报错或页面显示,直接看原始响应体。
区分以下六种本质不同的“空”:
① HTTP 204 No Content:服务端明确不返回任何body,常见于删除、更新类接口;
② HTTP 200 + 空字符串(""):响应体是空字符串,不是null也不是{};
③ HTTP 200 + {"code":0,"message":"success","data":null}:业务成功但data为null;
④ HTTP 200 + {"data":[]}:查询成功,但数据库/索引无匹配结果;
⑤ HTTP 200 + {"data":{"content":""}}:模型生成了空字符串,可能是提示词冲突或安全过滤触发;
⑥ Postman能拿到完整JSON,但代码里response.json()后取不到data:前端解析路径写错或字段名大小写不一致。
【关键前提】必须在Network面板里点开该请求,手动检查Headers下的Status Code和Response里的原始文本,否则所有排查都是盲猜。
验证业务码与data结构
方法一:用Postman或curl重放相同请求,确认是否真为空。重点比对:Authorization头是否带Bearer前缀、X-ZP-Timestamp时间戳是否在5分钟内、Content-Type是否严格为application/json。
方法二:在代码中打印完整response.text,而不是直接取response.json().data。很多开发者误以为response.json()一定有data字段,其实response.json()返回的是整个JSON对象,可能结构是{"choices":[{"message":{"content":"xxx"}}]}而非{"data":"xxx"}。
定位前端解析路径错误
第一步:复制Network中Response里的完整JSON文本 → 粘贴到JSONLint.com校验格式合法性;
第二步:观察顶层键名——若为choices,则说明调用的是OpenAI兼容端点(如/v4/chat/completions),应取response.choices[0].message.content;
第三步:若顶层键为data且内部含output字段(如{"data":{"output":"xxx"}}),说明调用的是AutoGLM专属端点(如/v3/model-api/auto-glm/invoke),需改用response.data.output;
第四步:若顶层键为error,立刻停止解析data,先处理错误码——此时data字段根本不存在,强行访问会抛出KeyError或undefined。
注意:JavaScript中response.json().data?.content ?? '' 这类可选链写法无法规避结构误判,必须先确认响应根结构再写取值逻辑。
检查流式与非流式响应格式差异
方法1:非流式响应(stream=False)返回单个完整JSON对象,结构固定,适合直接解析;
方法2:流式响应(stream=True)返回多个以\n分隔的JSON行(NDJSON),每行是一个ChatCompletionChunk对象,必须逐行解析并拼接delta.content;
【不可逆操作】若代码中设置了stream=True却按单对象JSON解析,response.json()会因首行不合法而直接报SyntaxError,无法进入后续逻辑。


















