猜一猜谜语 API 返回字段全解:三大接入点的 Title/Answer 与分页差异
猜一猜谜语API返回字段TitleAnswer字段避坑 # 猜一猜谜语 API 返回字段全解:三大接入点的 Title/Answer 与分页差异
> 接口/接入点:猜一猜谜语 API(151-2 / 151-3 / 151-4) · 免费 · 返回 JSON · 适用人群:已接入或准备接入的开发者 · 阅读时间:约 6 分钟
## 核心要点
- 三大接入点返回结构**彼此不一致**:151-2 用 `Title`/`Answer`(大写),151-4 用 `title`/`answer`(小写),151-3 返回 `typeList[id/name]`(无 contentlist)。
- 统一信封:`showapi_res_code`/`showapi_res_error`/`showapi_res_id` 在 `showapi_res_body` 之外;业务成败看 `showapi_res_body.ret_code`(`0` 成功)。
- 分页字段命名也不统一:151-2 用 `pagebean`,151-4 用 `pb`,151-3 无分页。
## Why:为什么这篇必读
猜一猜谜语 API 的三个接入点返回字段命名不统一,直接照抄一个接入点的解析代码去解析另一个,会取到 `undefined`。本文把三套结构摆在一起对照,帮你一次写对。
## What:接口速览
| 接入点 | 地址 | 返回主结构 | 谜面/谜底字段 | 分页字段 |
|--------|------|-----------|--------------|---------|
| 151-2 随机查询 | `route.showapi.com/151-2` | `pagebean.contentlist`(数组,文档示例 20 条)* | `Title` / `Answer`(大写) | `pagebean`(`allNum`/`allPages`/`currentPage`/`maxResult`) |
| 151-3 类型查询 | `route.showapi.com/151-3` | `typeList`(数组,无 contentlist) | 无(仅 `id`/`name` 类型) | 无 |
| 151-4 按类型分页 | `route.showapi.com/151-4` | `pb.contentlist`(数组) | `title` / `answer`(小写) | `pb`(`allNum`/`allPage`/`currentPage`/`maxResult`) |
\* **文档矛盾提醒**:151-2 的"返回示例"是 `pagebean.contentlist` 数组,但其"返回体字段表"与 OpenAPI schema 描述为单条扁平结构(无 `pagebean`)。解析时请防御性兼容两种形态(见 [字段大小写避坑](https://www.showapi.com/guides/riddle-field-case-151))。
## How:字段对照与解析
### 统一信封(三个接入点相同)
```json
{
"showapi_res_code": 0, // 系统级状态码
"showapi_res_error": "", // 系统级错误信息
"showapi_res_id": "ce13...", // 请求唯一标识
"showapi_res_body": { ... } // 业务数据在此
}
```
判断顺序:先看 `showapi_res_code`(非 0 看 `showapi_res_error`)→ 再看 `showapi_res_body.ret_code`(`0` 为业务成功)。
### 151-2 返回结构(节选)
```json
"showapi_res_body": {
"pagebean": {
"allNum": 20, "allPages": 1, "currentPage": 1, "maxResult": 20,
"contentlist": [ { "Title": "谜面", "Answer": "谜底", "typeId": "zlmy", "typeName": "智力问答" } ]
},
"ret_code": 0
}
```
### 151-3 返回结构(节选)
```json
"showapi_res_body": {
"ret_code": 0,
"typeList": [ { "id": "gxmy", "name": "搞笑谜语" } ]
}
```
### 151-4 返回结构(节选)
```json
"showapi_res_body": {
"pb": {
"allNum": "24660", "allPage": "1233", "currentPage": "1", "maxResult": "20",
"contentlist": [ { "title": "问:…", "answer": "答:茎", "typeId": "zlmy", "typeName": "智力问答" } ]
},
"ret_code": 0
}
```
### 防御性解析(兼容三套命名)
```python
def get_items(rb):
# 151-2: pagebean.contentlist (大写 Title/Answer)
if "pagebean" in rb:
return rb["pagebean"].get("contentlist", []), "Title", "Answer"
# 151-4: pb.contentlist (小写 title/answer)
if "pb" in rb:
return rb["pb"].get("contentlist", []), "title", "answer"
# 151-3: typeList(结构不同,单独处理)
if "typeList" in rb:
return rb["typeList"], "id", "name"
# 兼容 151-2 扁平单条形态(OpenAPI schema 描述)
if "Title" in rb or "title" in rb:
return [rb], ("Title" if "Title" in rb else "title"), ("Answer" if "Answer" in rb else "answer")
return [], None, None
```
## 返回示例与解析
完整示例见各接入点文档页:
- 151-2:https://www.showapi.com/apiGateway/view/151/2
- 151-3:https://www.showapi.com/apiGateway/view/151/3
- 151-4:https://www.showapi.com/apiGateway/view/151/4
`typeId` / `typeName` 取值含义见 [类型清单](https://www.showapi.com/guides/riddle-typelist-151)。
## 进阶/边界
- **分页字段差异**:151-2 用 `pagebean`,151-4 用 `pb`;151-4 的 `allNum`/`allPage` 在文档示例中为字符串类型,比较/计算前先转 `int`。
- **`ret_code` 位置**:在 `showapi_res_body` **内部**,不要和顶层 `showapi_res_code` 混淆。
- **151-3 无 contentlist**:它是类型列表接口,返回 `typeList`,不要套用谜面/谜底解析。
- 全部字段差异避坑代码见 [字段大小写避坑](https://www.showapi.com/guides/riddle-field-case-151)。
## FAQ
**Q1:为什么我按 Title 取不到值?**
你很可能在调 151-4,它返回的是小写 `title`/`answer`。151-2 才是大写 `Title`/`Answer`。详见上文对照表。
**Q2:ret_code 和 showapi_res_code 有什么区别?**
`showapi_res_code` 是系统级(鉴权/限流/网关)状态码,在 `showapi_res_body` 外;`ret_code` 是业务状态码,在 `showapi_res_body` 内,`0` 表示业务成功。
**Q3:151-2 到底有没有 pagebean?**
文档自身矛盾:返回示例有 `pagebean.contentlist`,字段表与 OpenAPI schema 描述为扁平单条。以实际返回为准,代码做防御性解析(本文已给模板)。
**Q4:分页 total 是数字还是字符串?**
151-4 示例中 `allNum`/`allPage` 为字符串,使用前 `int()` 转换,避免比较出错。
**Q5:151-3 能拿到谜面谜底吗?**
不能。151-3 是类型查询,只返回 `typeList[id/name]`,要拿谜面谜底请调 151-2 或 151-4。
## 相关能力 / 下一步阅读
- [避坑:三大接入点返回字段大小写不一致,解析代码怎么写才稳](https://www.showapi.com/guides/riddle-field-case-151)
- [猜一猜谜语 API 类型清单:26 类谜语 typeId 完整对照表](https://www.showapi.com/guides/riddle-typelist-151)
- [猜一猜谜语 API:5 分钟接入,调通你的第一条随机谜语](https://www.showapi.com/guides/riddle-quickstart-151)
- **本系列共 13 篇**:查看[猜一猜谜语 API 指南总目录](https://www.showapi.com/guides/riddle-guides-151)