周公解梦 API:分页与结果集怎么用?maxResult/allNum/allPages 详解
周公解梦分页maxResultallPages结果集 # 周公解梦 API:分页与结果集怎么用?maxResult/allNum/allPages 详解
> 接口:免费解梦详细(apiCode 1601)· 接入点:解梦详细(1601-2)· **免费** · 参数 `page` 控制翻页 · 适用人群:需要完整取数 / 做「加载更多」的开发者 · 阅读约 6 分钟
## 核心要点
- 分页字段都在 `showapi_res_body` 内:`maxResult`(每页上限)、`allNum`(总条数)、`allPages`(总页数)、`currentPage`(当前页)。
- 翻页靠 `page` 参数(String,默认 `"1"`),递增到 `allPages` 为止,不要超过。
- 单关键词常命中多条,「加载更多」按钮应依据 `allPages` 判断还有没有下一页。
## Why:这跟我有什么关系
你想做一个「梦境解读」列表,用户点「查看更多」要能翻出后面的词条;或者你想把某个关键词的全部解读一次性抓全做离线索引。这两种场景都绕不开分页字段。本文讲清四个字段怎么读、翻页循环怎么写才不越界。
## What:前置条件与接口速览
| 项目 | 说明 |
|------|------|
| 接口地址 | `https://route.showapi.com/1601-2?appKey={your_appKey}` |
| 必填参数 | `keyWords` |
| 选填参数 | `page`(页码,默认 `"1"`) |
| 分页字段(在 `showapi_res_body` 内) | `maxResult`、`allNum`、`allPages`、`currentPage` |
| 接入点说明 | 内容参考《周公解梦全书》部分信息,提供解读参考(文化参考,非科学/医疗结论) |
## How:翻页循环怎么写
**字段含义**
| 字段 | 含义 | 示例值 |
|------|------|--------|
| `maxResult` | 每页最大结果数 | `"10"` |
| `allNum` | 总结果数 | `"2"` |
| `allPages` | 总页数 | `"1"` |
| `currentPage` | 当前页 | `"1"` |
**Python:翻完全部页(带上限保护)**
```python
import requests
APP_KEY = "YOUR_APPKEY"
URL = "https://route.showapi.com/1601-2"
KEYWORD = "飞"
MAX_PAGES = 20 # 安全上限,避免极端情况下死循环
all_items = []
page = 1
while True:
resp = requests.post(
URL, params={"appKey": APP_KEY},
data={"keyWords": KEYWORD, "page": str(page)},
headers={"content-type": "application/x-www-form-urlencoded"},
timeout=10,
)
data = resp.json()
if data.get("showapi_res_code") != 0:
raise RuntimeError(data.get("showapi_res_error"))
body = data["showapi_res_body"]
if body.get("ret_code") != "0":
raise RuntimeError(f"ret_code={body.get('ret_code')}")
all_items.extend(body.get("contentlist", []))
total_pages = int(body.get("allPages", "1"))
if page >= total_pages or page >= MAX_PAGES:
break
page += 1
print(f"共抓取 {len(all_items)} 条,跨 {page} 页")
```
**JavaScript:带「加载更多」的翻页判断**
```javascript
const APP_KEY = "YOUR_APPKEY";
const fetchPage = (kw, page) =>
fetch(`https://route.showapi.com/1601-2?appKey=${APP_KEY}`, {
method: "POST",
headers: { "content-type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({ keyWords: kw, page: String(page) }),
}).then((r) => r.json());
let currentPage = 1;
let totalPages = 1;
async function loadMore(kw) {
const data = await fetchPage(kw, currentPage);
const body = data.showapi_res_body;
totalPages = parseInt(body.allPages, 10) || 1;
body.contentlist?.forEach((it) => renderCard(it));
if (currentPage < totalPages) {
currentPage += 1;
showLoadMoreButton(); // 还有下一页
} else {
hideLoadMoreButton(); // 到底了
}
}
```
## 返回示例与解析
`keyWords=飞&page=1` 返回 `maxResult=10`、`allNum=2`、`allPages=1`、`currentPage=1`——只有 1 页,无需翻页。当 `allPages > 1` 时,把 `page` 递增继续请求即可。
## 进阶 / 边界
- **`page` 是字符串页码**:传 `"1"`/`"2"` 即可;超过 `allPages` 时接口通常返回空 `contentlist`,不要靠它报错,应主动以 `allPages` 为界。
- **免费有档位限制**:翻页本质是多次调用,会吃档位;做离线索引时建议控制频率并缓存结果(见《[免费档位与调用限制说明](https://www.showapi.com/guides/dream-free-tier-1601)》)。
- **`maxResult` 非你可控**:每页上限由接口决定(示例为 10),不要假设能调大;要拿全量就读完所有页。
- **内容为文化参考**:`detailList` 来自《周公解梦全书》类资料,展示时加「仅供娱乐参考」提示。
## FAQ
**Q1:怎么知道还有没有下一页?**
读 `showapi_res_body.allPages`,当 `currentPage < allPages` 时就有下一页。
**Q2:page 传超过 allPages 会怎样?**
通常返回空 `contentlist`(或当前页无数据),不会报错;建议以 `allPages` 为循环上界,并设安全上限防死循环。
**Q3:每页条数能改吗?**
`maxResult` 由接口决定(示例为 10),请求参数里没有可调页大小的字段,按接口返回为准。
**Q4:翻页频繁会触发限制吗?**
会吃免费档位。批量抓取时控制并发、加间隔、缓存结果。详见免费档位说明。
**Q5:分页字段是数字还是字符串?**
示例中为字符串(如 `"allPages":"1"`),解析时做类型兼容(先按字符串读,`int()`/`parseInt` 转换)。
## 相关能力 / 下一步阅读
- [周公解梦 API 返回字段全解:ret_code、contentlist、分页字段一文读懂](https://www.showapi.com/guides/dream-response-fields-1601)
- [周公解梦 API:关键词怎么查才准?关键词选取与结果解读实战](https://www.showapi.com/guides/dream-keywords-guide-1601)
- [周公解梦 API 免费档位与调用限制说明:如何避免触发限流?](https://www.showapi.com/guides/dream-free-tier-1601)
- **本系列共 8 篇**:查看[周公解梦 API 指南总目录](https://www.showapi.com/guides/dream-guides-1601)