技术博客
星座运势查询:调用失败排查(ret_code 与 showapi_res_code 区别)

星座运势查询:调用失败排查(ret_code 与 showapi_res_code 区别)

作者: 万维易源
2026-08-27
星座运势查询错误处理ret_codeappKey错误
# 星座运势查询:调用失败排查(ret_code 与 showapi_res_code 区别) > 接口 872(两接入点)· 免费 · 适用:已接入开发者、需做错误处理的工程师 · 阅读时间:约 6 分钟 ## TL;DR - 响应有两层状态码:**系统级 `showapi_res_code`**(鉴权/参数/频率,失败非 0)与**业务级 `ret_code`**(在 `showapi_res_body` 内,0 成功)。 - 先判 `showapi_res_code === 0` 再判 `body.ret_code === "0"`,两层都过才算成功。 - 本次实测:用错误/未授权 AppKey 调 872-1 返回 `showapi_res_code: -1004 / "appKey err"`,属系统级鉴权失败。 ## Why:为什么要区分两层 很多团队只判断 HTTP 200 就认为成功,结果拿到 `showapi_res_body` 为空或业务失败。ShowAPI 的响应结构里,系统级错误(如 AppKey 错、频率超限)和业务级错误(参数组合无效)分属两个字段,必须分别判断,否则会出现「请求通了但数据为空」的诡异 bug。 ## What:两层状态码 | 层级 | 字段位置 | 成功值 | 含义 | |------|----------|--------|------| | 系统级 | 根 `showapi_res_code` | `0` | 平台层是否受理(鉴权、频率、路由) | | 业务级 | `showapi_res_body.ret_code` | `"0"` | 业务是否成功(参数组合是否有效) | > 业务级 `ret_code` 文档标注「0 为成功,其他失败」(字符串)。系统级 `showapi_res_code` 常见为 0 成功、负数表示各类平台错误。 ## How:健壮的错误处理 Python(requests): ```python import requests def call_horoscope(params: dict): r = requests.get("https://route.showapi.com/872-1", params=params, timeout=10) data = r.json() # 第一层:系统级 if data.get("showapi_res_code") != 0: raise RuntimeError(f"系统错误 {data.get('showapi_res_code')}: {data.get('showapi_res_error')}") body = data["showapi_res_body"] # 第二层:业务级 if str(body.get("ret_code")) != "0": raise RuntimeError(f"业务错误 ret_code={body.get('ret_code')}") return body try: body = call_horoscope({"appKey": "YOUR_APPKEY", "star": "shizi"}) except RuntimeError as e: # 记录日志 + 走兜底文案,不要白屏 print("运势暂不可用:", e) ``` ## 实测案例(真实证据) 对 `https://route.showapi.com/872-1` 用未对 872 授权的 AppKey 请求,返回: ```json { "showapi_res_error": "appKey err", "showapi_res_code": -1004, "showapi_res_body": {} } ``` 这属于**系统级鉴权失败**(`showapi_res_code: -1004`),应在调用前校验 AppKey 有效性,并在 UI 给出「服务暂不可用」兜底。 ## 进阶 / 边界 - **系统级枚举**:具体 `showapi_res_code` 负值枚举(鉴权/参数/频率等)以平台文档为准;本文仅实测确认 `-1004 = appKey err`。不建议靠猜测补全其它码值。 - **业务级 ret_code**:文档仅给出「0 成功,其他失败」,未穷举其它值;非 0 时直接按失败处理并打日志即可。 - **超时与重试**:建议 `timeout=10`,对网络抖动做有限指数退避重试,但不要对「鉴权失败」重试(必败)。 ## FAQ **Q:HTTP 200 但没数据,是怎么回事?** A:多半是系统级 `showapi_res_code` 非 0(如 -1004 appKey err),业务体为空。先查该字段再查 `ret_code`。 **Q:ret_code 是数字还是字符串?** A:文档标注为字符串("0"),判断时用 `str(body.get("ret_code")) != "0"` 最稳,避免类型陷阱。 **Q:频率限制会返回什么?** A:通常体现为系统级 `showapi_res_code` 非 0(频率类错误)。具体码值以平台文档为准;做好[缓存](https://www.showapi.com/guides/horoscope-cache-872)可从根本上规避。 ## 下一步阅读 - [免费接口也有限流:星座运势查询缓存策略](https://www.showapi.com/guides/horoscope-cache-872) - [星座运势查询:5 分钟接入指南](https://www.showapi.com/guides/horoscope-quickstart-872) - [星座运势查询返回字段全解](https://www.showapi.com/guides/horoscope-response-fields-872) - **本系列共 13 篇**:查看[星座运势 API 开发指南总目录](https://www.showapi.com/guides/horoscope-guides-872)