技术博客
唐诗宋词元曲查询返回结构全解:ret_code、dynastyInfo、poemInfo 一文读懂

唐诗宋词元曲查询返回结构全解:ret_code、dynastyInfo、poemInfo 一文读懂

作者: 万维易源
2026-09-03
唐诗宋词元曲查询返回字段ret_codedynastyInfopoemInfo
# 唐诗宋词元曲查询返回结构全解:ret_code、dynastyInfo、poemInfo 一文读懂 > 接口:唐诗宋词元曲等诗词查询(apiCode=1620)· 免费 · 请求方式 POST/GET · 返回 JSON · 适用:已接入或准备接入的开发者 · 阅读约 6 分钟 ## 核心要点 - 所有返回都包在 `showapi_res_body` 内,系统级字段(`showapi_res_code` 等)在它外层,业务字段在它里面 - `ret_code` 是**字符串** `"0"` 表示成功,判断务必用字符串比较 - 三个接入点的列表字段 `dynastyInfo` / `poetInfo` / `poemInfo` 以及诗词正文 `contentlist` **都是数组**,遍历时按数组处理 ## Why:先把结构看明白,后面少踩坑 三个接入点字段不少,尤其容易在两点上栽跟头:一是把 `ret_code` 当数字比较导致判断失效;二是把本该是数组的 `poemInfo` / `contentlist` 当成单对象,结果取不到值。本篇把三个接入点的字段一次性摊开,配一张对照表,建议收藏当速查页用。 ## What:统一封装规则与接口速览 | 项目 | 说明 | |------|------| | 接口编码 | 1620 | | 接入点 | 1620-3 查询朝代列表 / 1620-4 人名或朝代查询诗人 / 1620-5 名称查询诗词列表 | | 返回格式 | JSON | | 外层结构 | `showapi_res_code` / `showapi_res_error` / `showapi_res_id` / `showapi_res_body` | | 业务数据 | 全部位于 `showapi_res_body` 内 | | 成功标识 | `showapi_res_body.ret_code == "0"`(字符串) | ## How:三接入点字段对照 ### 接入点 1620-3 · 查询朝代列表 返回 `dynastyInfo`(Object[]),每项: | 字段 | 类型 | 说明 | |------|------|------| | `dynasty` | String | 朝代名称(宋代、唐代、南北朝…) | | `dynastyId` | String | 朝代唯一 ID,下游查诗人入参 | > 文档示例共 15 个朝代:宋代、唐代、南北朝、元代、两汉、现代、清代、五代、明代、魏晋、金朝、隋代、先秦、近代、未知。 ### 接入点 1620-4 · 人名或朝代查询诗人 入参(均选填):`dynastyId`(朝代Id)、`poet`(诗人名,如「苏轼」)、`page`(页码,默认 1)。 返回: | 字段 | 类型 | 说明 | |------|------|------| | `ret_code` | String | `"0"` 成功 | | `remark` | String | 提示信息 | | `allPages` | 数值 | 总页数 | | `currentPage` | 数值 | 当前页 | | `allNum` | 数值 | 总条数 | | `maxResult` | 数值 | 每页条数(文档示例为 20) | | `poetInfo` | Object[] | 诗人列表 | | `poetInfo[].poet` | String | 诗人名 | | `poetInfo[].dynastyId` | String | 朝代 ID | | `poetInfo[].dynasty` | String | 朝代名 | | `poetInfo[].poetId` | String | 诗人唯一 ID,下游查诗词入参 | | `poetInfo[].biography` | String | 生平简介 | ### 接入点 1620-5 · 名称查询诗词列表 入参(均选填):`poetId`(诗人id)、`title`(诗词名称,**不支持模糊查询**)、`page`(页码,默认 1)。 返回: | 字段 | 类型 | 说明 | |------|------|------| | `poemInfo` | Object[] | 诗词列表 | | `poemInfo[].title` | String | 诗名 | | `poemInfo[].dynasty` / `dynastyId` | String | 朝代名 / 朝代 ID | | `poemInfo[].poemId` | String | 诗唯一 ID | | `poemInfo[].note` | String | 标签(如「辞赋精选,高中文言文,古文观止…」) | | `poemInfo[].poetId` / `poet` | String | 诗人 ID / 诗人名 | | `poemInfo[].contentlist` | Object[] | 原文/译文/注释,可多段 | | `contentlist[].original` | String | 原文 | | `contentlist[].translation` | String | 译文 | | `contentlist[].annotation` | String | 注释 | | `allPages` / `currentPage` / `allNum` / `maxResult` | 数值 | 分页信息 | **通用判断模板(Python)** ```python import requests def call(url, app_key, **params): r = requests.post(url, params={"appKey": app_key, **params}, headers={"content-type": "application/x-www-form-urlencoded"}, timeout=10) body = r.json().get("showapi_res_body", {}) if body.get("ret_code") != "0": # 注意是字符串比较 raise RuntimeError(body.get("remark")) return body # 三个接入点都是返回数组,统一遍历 body = call("https://route.showapi.com/1620-5", "YOUR_APPKEY", poet="苏轼", page=1) for poem in body["poemInfo"]: # poemInfo 是数组 for seg in poem["contentlist"]: # contentlist 也是数组 print(seg["original"]) ``` ## 返回示例与解析 以 1620-5 查询苏轼《前赤壁赋》为例(节选): ```json { "showapi_res_body": { "ret_code": "0", "remark": "查询成功!", "poemInfo": [ { "title": "前赤壁赋", "dynasty": "宋代", "dynastyId": "5b1de348cbf6a77b365977e5", "poemId": "5b1e3749cbf69480cb8e81f4", "note": "辞赋精选,高中文言文,古文观止,写景,饮酒,感叹,哲理", "contentlist": [ { "original": "壬(rén)戌(xū)之秋,七月既望……", "translation": "壬戌年秋,七月十六日……", "annotation": "壬戌:宋神宗元丰五年……" } ], "poetId": "5b1e3644cbf69480cb8e81f7", "poet": "苏轼" } ], "maxResult": 20, "allNum": 258, "allPages": 13, "currentPage": 1 } } ``` ## 进阶 / 边界 - **数组思维**:`dynastyInfo` / `poetInfo` / `poemInfo` / `contentlist` 全部是数组。即使只返回一条,也要用下标或 `for` 遍历,不要直接 `.field`。 - **`ret_code` 是字符串**:文档中所有状态码值都是字符串(如 `"0"`),用 `== "0"` 判断;若用 `== 0` 会恒为 False。 - **失败枚举未公开**:文档只说明「`ret_code` 非 0 为失败」,未列出具体失败码与含义。遇到非 0 时以 `remark` 文案为准,不要臆测具体错误码。 ## FAQ **Q1:ret_code 返回 0 但 showapi_res_body 里没数据?** 先确认入参是否命中数据。例如 1620-5 的 `title` 是精确匹配,写错一字或用了别称都会查不到;1620-4 若 `dynastyId` 与 `poet` 都不传,也可能无结果。先用已知示例值(如 `poet=苏轼`)验证链路。 **Q2:poemInfo 和 contentlist 到底几层?** 两层数组:`poemInfo` 是「诗列表」,每首诗里的 `contentlist` 是「段落列表」(一首长诗/辞赋可能分成多段,每段含原文/译文/注释)。渲染时两层都要遍历。 **Q3:maxResult 固定是 20 吗?能改吗?** 文档示例中 `maxResult` 为 20,是由服务端控制的每页条数,请求参数里没有「每页条数」字段,不能由调用方修改,只能靠 `page` 翻页。 **Q4:biography 和 note 字段一定会返回吗?** 二者均为字符串字段,查到对应数据时才会有内容;空数据时可能为空串或不出现,前端需做空值兜底。 ## 相关能力 / 下一步阅读 - [唐诗宋词元曲查询:从「朝代」到「诗人」到「诗词」三步全链路串联](https://www.showapi.com/guides/poem-three-step-flow-1620) — 把三个接入点的字段串成一条链 - [唐诗宋词元曲查询:page 与 maxResult=20 分页翻页拉取全部诗词](https://www.showapi.com/guides/poem-pagination-1620) — 翻页拉全量数据 - **本系列共 12 篇**:查看[唐诗宋词元曲查询指南总目录](https://www.showapi.com/guides/poem-guides-1620)