童话故事集 API:故事分类接入点(1700-1)怎么用?含 10 类对照
# 童话故事集 API:故事分类接入点(1700-1)怎么用?含 10 类对照
> 元信息:童话故事集 API(apiCode=1700)· 接入点 1700-1 · 免费服务 · 返回 JSON · 适用人群:需构建分类导航的开发者 · 阅读时间约 5 分钟
## 核心要点
- 1700-1 无业务请求参数,调用即返回全部分类清单(真实结构为 `storylist[]`)。
- 每个分类含 `classify`(名称)与 `classifyId`(编号),后者是 1700-2 列表查询的必填参数。
- 分类清单变化频率低,建议缓存,不要每次渲染都实时拉取。
## Why:为什么先讲分类
任何"故事书架"类产品,第一步都是先把类别摆出来:安徒生童话、格林童话、成语故事……1700-1 就是干这个的。你拿到分类后,把它作为导航菜单,用户点某个分类,你再带着 `classifyId` 去 1700-2 拉该分类下的故事列表。所以 1700-1 是整个链路的入口。
## What:接口速览
| 项目 | 说明 |
|------|------|
| 接口地址 | `https://route.showapi.com/1700-1?appKey=YOUR_APPKEY` |
| 请求参数 | 无业务参数(仅可选 Header `content-type`) |
| 返回数组 | `showapi_res_body.storylist[]` |
| 计费 | 免费 |
## How:取分类并构建菜单
```python
import requests
APPKEY = "YOUR_APPKEY"
url = f"https://route.showapi.com/1700-1?appKey={APPKEY}"
r = requests.post(url, headers={"content-type": "application/x-www-form-urlencoded"}, timeout=10)
body = r.json()["showapi_res_body"]
if body.get("ret_code") != "0":
raise SystemExit(body.get("remark"))
# 构建分类菜单:名称 -> classifyId
menu = {item["classify"]: item["classifyId"] for item in body["storylist"]}
print(menu)
# 例:{'儿童小故事':'1','安徒生童话':'2', ...}
```
```bash
curl -X POST "https://route.showapi.com/1700-1?appKey=YOUR_APPKEY" \
-H "content-type: application/x-www-form-urlencoded"
```
```javascript
const r = await fetch(`https://route.showapi.com/1700-1?appKey=YOUR_APPKEY`, {
method: "POST",
headers: { "content-type": "application/x-www-form-urlencoded" },
});
const body = (await r.json()).showapi_res_body;
const menu = {};
for (const it of body.storylist) menu[it.classify] = it.classifyId;
```
## 分类对照(以真实返回为准)
文档说明分类涵盖以下类别,实际请以接口返回的 `storylist` 为准(下列为常见分类示例):
| classifyId | classify |
|------|------|
| 1 | 儿童小故事 |
| 2 | 安徒生童话 |
| 3 | 格林童话 |
| 4 | 一千零一夜 |
| 5 | 经典童话 |
| 6 | 成语故事 |
| 7 | 寓言故事 |
| 8 | 民间故事 |
| 9 | 童话故事 |
| 10 | 王尔德童话 |
> 说明:上表为分类含义示例,具体编号与名称以接口实时返回为准,代码里不要写死,直接消费 `storylist`。
## 返回示例与解析
```json
{
"showapi_res_body": {
"ret_code": "0",
"remark": "查询成功!",
"storylist": [
{ "classify": "儿童小故事", "classifyId": "1" },
{ "classify": "安徒生童话", "classifyId": "2" }
]
}
}
```
## 进阶 / 边界
- **真实结构为 `storylist[]`**:文档字段表写的是扁平 `classify/classifyId`,但真实返回是数组,以数组为准(详见[返回字段全解](https://www.showapi.com/guides/child-story-fields-1700))。
- **不要写死分类**:分类数量和编号可能调整,菜单应动态渲染接口返回,避免硬编码 1~10。
- **缓存策略**:分类很少变动,建议服务端缓存数小时(见[缓存与分页策略](https://www.showapi.com/guides/child-story-cache-1700))。
## FAQ
**Q: 1700-1 需要传什么参数?**
A: 不需要业务参数,直接调用即可。仅可选 Header `content-type`。
**Q: 为什么我代码里用 classify 取不到值?**
A: 真实返回数组叫 `storylist`,每个元素是 `{classify, classifyId}`,请用 `body.storylist` 遍历,不要按文档字段表的扁平字段处理。
**Q: 分类编号会变吗?**
A: 接口以实时返回为准,建议动态消费,不要在前端写死编号与名称的映射。
**Q: 拿到 classifyId 之后做什么?**
A: 把它作为 1700-2 故事列表的 `classifyId` 必填参数,去拉该分类下的故事列表。
## 相关能力 / 下一步阅读
- [童话故事集 API:故事列表搜索与分页实战](https://www.showapi.com/guides/child-story-list-guide-1700)
- [童话故事集 API 返回字段全解](https://www.showapi.com/guides/child-story-fields-1700)
- [童话故事集 API:5 分钟接入](https://www.showapi.com/guides/child-story-quickstart-1700)
- **本系列共 12 篇**:查看[童话故事集 API 指南总目录](https://www.showapi.com/guides/child-story-guides-1700)