脑筋急转弯两个接入点返回结构差异:contentlist 与 list 别搞混
# 脑筋急转弯两个接入点返回结构差异:contentlist 与 list 别搞混
> 接口/接入点:脑筋急转弯(1618-2 列表 / 1618-3 随机) · 免费服务 · 返回 JSON · 适用人群:中高级开发者、接入排障 · 阅读时间约 6 分钟
## 核心要点
- 1618-2(列表)业务数组字段是 `contentlist`,带分页四件套 `allNum`/`allPages`/`currentPage`/`maxResult`。
- 1618-3(随机)业务数组字段是 `list`,带 `remark`/`ret_code`,**无分页字段**。
- 若用同一套解析逻辑(都读 `contentlist`)同时接两个接入点,随机接口会解析出空数组——这是最高频的坑。
## Why:为什么专门写这篇
实测中大量"接口没返回数据"的工单,根因不是接口挂了,而是把两个接入点的返回结构当成一个。本文把差异讲透,并给出统一适配层写法,减少后续排障。
## What:差异对照
| 维度 | 1618-2 查询列表 | 1618-3 随机生成 |
|------|----------------|----------------|
| 业务数组字段 | `contentlist` | `list` |
| 单题结构 | `{question, answer}` | `{question, answer}` |
| 分页字段 | 有(allNum/allPages/currentPage/maxResult) | 无 |
| 额外字段 | 无 | `remark`、`ret_code` |
| 参数 | `page` | `len`(最大 20) |
## How:统一适配层(adapter)
不要在每个业务里散落 `if endpoint == 2`,集中做一个归一化函数:
```python
def normalize(body, endpoint):
"""把两个接入点的返回归一化为 [{question, answer}]"""
if endpoint == "1618-2":
items = body.get("contentlist", [])
meta = {k: body.get(k) for k in ("allNum", "allPages", "currentPage", "maxResult")}
else: # 1618-3
items = body.get("list", [])
meta = {"remark": body.get("remark"), "ret_code": body.get("ret_code")}
return [{"q": i.get("question"), "a": i.get("answer")} for i in items], meta
# 使用
data2 = requests.get("https://route.showapi.com/1618-2", params={"appKey": "YOUR_APPKEY", "page": "1"}, timeout=10).json()
qs2, m2 = normalize(data2["showapi_res_body"], "1618-2")
data3 = requests.get("https://route.showapi.com/1618-3", params={"appKey": "YOUR_APPKEY", "len": "3"}, timeout=10).json()
qs3, m3 = normalize(data3["showapi_res_body"], "1618-3")
```
cURL(对比两个接入点):
```bash
curl -s --max-time 10 "https://route.showapi.com/1618-2?appKey=YOUR_APPKEY&page=1" | head -c 400
curl -s --max-time 10 "https://route.showapi.com/1618-3?appKey=YOUR_APPKEY&len=2" | head -c 400
```
## 返回示例与解析
列表:`showapi_res_body.contentlist`。随机:`showapi_res_body.list` + `remark` + `ret_code`。肉眼可见字段名不同,解析必须区分。
## 进阶 / 边界
- 文档中 1618-3 的返回参数标注为"暂无返回参数说明",本文结论来自真实调用验证,以实测为准。
- 适配层建议同时兼容"字段缺失":用 `.get()` 而非下标访问,避免某字段临时调整导致崩溃。
## FAQ
**Q1:随机接口读 `contentlist` 为空,是接口坏了吗?** 不是,随机接口用 `list`,详见本文适配层。
**Q2:两个接口的单题字段一样吗?** 一样,都是 `{question, answer}`,只有外层数组字段名不同。
**Q3:随机接口有 `ret_code`,列表接口没有,正常吗?** 正常,这是两个接入点结构差异的一部分。
**Q4:能统一成一个 URL 吗?** 不能,1618-2 与 1618-3 是不同接入点、不同地址。
## 相关能力 / 下一步阅读
- [脑筋急转弯 API 返回字段全解:contentlist / list / 分页字段一文读懂](https://www.showapi.com/guides/brainteaser-response-fields-1618)
- [免费脑筋急转弯接口的题库去重与本地缓存策略](https://www.showapi.com/guides/brainteaser-best-practice-dedup-1618)
- [脑筋急转弯 API:5 分钟从注册到拿到第一道题](https://www.showapi.com/guides/brainteaser-quickstart-1618)
- **本系列共 12 篇**:查看[脑筋急转弯 API 指南总目录](https://www.showapi.com/guides/brainteaser-guides-1618)