随机诗词API参数详解:type主题枚举与action调试实践

📅 2026/8/4 12:03:15 👁️ 阅读次数 📝 编程学习
随机诗词API参数详解:type主题枚举与action调试实践

从参数视角理解随机诗词接口

调用第三方内容接口时,"能调通"通常只解决一部分问题,真正决定代码稳定性的往往是对参数的语义理解。随机诗词接口虽然结构简单,但 type 与 action 两个字段的组合方式、取值边界和优先级关系如果不搞清楚,很容易在联调阶段反复返工。这篇笔记不重复接口文档,而是把两个请求参数逐个拆开,结合 curl 与 Python 示例说明如何构造请求、解读返回,以及在生产环境落地的注意事项。

适用场景:先判断业务位置

随机诗词接口适合以下使用位置:

  • 网站首页或内容频道的"每日一诗"模块,按日期或星期切换主题。
  • 聊天机器人内的文本指令,用户指定"山水"或"节日"后返回对应诗词。
  • 内部内容生产管线中的素材采集环节,先获取原始文本再由人工筛选。
  • 教育类小程序课堂导入,按季节动态切换诗词主题。

不适合的场景包括对响应时间强敏感的高并发展示页,因为接口 QPS 为 5 次/秒,设计时需要考虑限速。另外,它不提供按作者、朝代或诗词长度筛选的能力,这类需求需要寻找其他数据源或本地词库。

接口能力边界

先明确这个接口能做什么、不能做什么:

  • 请求方法:POST
  • 请求地址:https://v1.apizero.cn/api/shici
  • 主题筛选:支持 10 种类型,通过 type 参数传入。
  • 类型查询:通过 action=types 获取全部主题标识列表,该操作不消耗调用额度。
  • 速率限制:QPS 5 / 秒,超出后的具体表现以文档为准。

可以把接口理解为"按主题返回随机诗词的只读能力"。它不承诺返回结果不重复,也不提供分页或游标,每次调用都是一次独立的随机抽样。

请求参数详解

请求头与鉴权

所有请求使用 POST,并携带两个请求头:

  • X-API-Key:访问密钥,建议通过环境变量 $APIZERO_API_KEY 引用,避免把密钥硬编码进代码仓库。
  • Content-Type: application/json

请求体是一个 JSON 对象,最多包含两个字段:type 与 action,两者均可选。

type 字段:10 个主题枚举

type 是核心筛选参数,取值使用英文标识,与中文主题的对应关系如下:

type 值中文主题
shuqing抒情
siji四季
shanshui山水
tianqi天气
renwu人物
shenghuo生活
jieri节日
dongwu动物
zhiwu植物
shiwu食物

这个映射关系在写配置表或数据库字典时建议原样保留。原因有二:一是接口的枚举值不会因为前端展示文案变化而改变;二是如果自行改成拼音缩写或自定义编号,后续排查问题时需要额外维护一层翻译逻辑。

type 缺省时,接口在所有主题范围内随机返回一首诗词;显式传入 type 则缩小随机范围。注意 type 区分大小写,传 "ShanShui" 或 "TianQi" 都不会被识别,只能使用小写枚举值。

action 字段:调试与类型发现

action 当前只有一个可用取值:types。请求时携带 action=types,接口返回主题类型列表而不是诗词。这个能力有两个用途:

  1. 接入初期验证 API Key 是否有效,且不消耗调用额度。
  2. 在配置后台动态渲染主题筛选项,接口侧新增主题时客户端无需发版。

当 action 与 type 同时存在时,action 优先,可以理解为一种"调试模式"。实际开发时要注意:先请求 types 再请求诗词,两次请求共享同一个 QPS 配额。

参数组合规则

通过一个表格汇总不同参数组合的行为:

type 值action 值接口行为
全主题范围内随机返回一首诗词
siji四季主题范围内随机返回一首诗词
types返回全部主题类型列表
sijitypesaction 优先,返回主题类型列表

空值代表字段缺省或传空字符串。实际测试时,请求体传 {} 也能触发一次正常的随机诗词请求,这可以作为连通性检查的最小用例。

curl 接入示例

基础随机请求

把 API Key 存放在环境变量中,避免密钥出现在命令行历史里:

export APIZERO_API_KEY="your-key-here" curl -sS \ -X POST \ -H "X-API-Key: $APIZERO_API_KEY" \ -H "Content-Type: application/json" \ -d '{}' \ "https://v1.apizero.cn/api/shici"

按主题筛选

指定 theme 类型为四季:

curl -sS \ -X POST \ -H "X-API-Key: $APIZERO_API_KEY" \ -H "Content-Type: application/json" \ -d '{"type": "siji"}' \ "https://v1.apizero.cn/api/shici"

获取类型列表

请求 action=types 拿到主题枚举清单:

curl -sS \ -X POST \ -H "X-API-Key: $APIZERO_API_KEY" \ -H "Content-Type: application/json" \ -d '{"action": "types"}' \ "https://v1.apizero.cn/api/shici"

三个示例覆盖了参数组合表中的三类核心行为。注意 -d 参数里的 JSON 保持单行即可,不需要额外的转义;如果使用 Windows CMD,引号规则需要做相应调整。

Python 代码接入

生产环境更常见的做法是用编程语言封装。以下使用 requests 库做一个最小封装,重点是把 type 与 action 参数从配置中解析出来:

import json import os import requests API_URL = "https://v1.apizero.cn/api/shici" API_KEY = os.environ["APIZERO_API_KEY"] HEADERS = { "X-API-Key": API_KEY, "Content-Type": "application/json", } def fetch_poem(poem_type: str | None = None, action: str | None = None) -> dict: payload = {} if poem_type: payload["type"] = poem_type if action: payload["action"] = action resp = requests.post(API_URL, headers=HEADERS, json=payload, timeout=8) resp.raise_for_status() return resp.json() if __name__ == "__main__": # 获取类型列表,用于校验 API Key print(json.dumps(fetch_poem(action="types"), ensure_ascii=False, indent=2)) # 获取山水主题诗词 print(json.dumps(fetch_poem(poem_type="shanshui"), ensure_ascii=False, indent=2))

这段代码做了一件关键的事情:只在参数有值时才放入 payload,避免出现 {"type": null} 或 {"action": ""} 这类无效字段。在 Python 3.10+ 环境中,str | None 类型注解可以正常工作;更早版本请改用 Optional[str]。

返回字段解读

响应体是标准 JSON 结构,基础框架如下:

{ "code": 200, "data": {}, "message": "success" }

三个字段的含义:

字段类型含义
codenumber业务状态码,200 表示成功
dataobject具体返回数据,结构随请求参数变化
messagestring可读的状态说明

data 内部的具体字段(例如诗词标题、作者、正文等)未在公开示例中完整列出,实际开发时应以文档为准,建议先写一段"字段探测"代码确认原始结构:

raw = fetch_poem(poem_type="shanshui") print(json.dumps(raw, ensure_ascii=False, indent=2))

拿到真实返回后,再把 data 中的字段收敛到数据类或常量字典中,避免在业务代码里散落魔法字符串。对于 action=types 的请求,data 中通常是一个主题标识列表,可以直接用于渲染下拉框。

常见错误与排查切入点

401 鉴权失败

  • 确认 X-API-Key 请求头的名称拼写,注意大小写。
  • 确认环境变量已正确 export,并且当前 shell 会话未过期。
  • 检查代码中是否使用了单引号包裹变量,导致未做变量展开。

400 参数错误

  • 检查 type 是否传入了不存在的枚举值,如 zuowu、renwen。
  • 检查 JSON 格式是否合法,手工拼接请求体时最容易出现多余逗号或引号不配对。
  • 确认请求方法是否为 POST,一旦误用 GET 会被拒绝。

429 频率受限

  • QPS 为 5 / 秒,是全局共享配额,假设自己不是唯一调用方。业务代码中的并发请求数应控制在 1~2 个以内。
  • 检查是否在循环中连续调用而没有 sleep。例如批量拉取 50 首诗词时,需要显式加入间隔。

响应超时

  • 第三方接口存在网络抖动,客户端应设置 5~10 秒的连接超时。

工程化注意事项

把接口接入生产环境时,建议在以下四个方向多花时间:

1. 主题枚举本地化

把 type 的 10 个枚举值同步到前端下拉框或后端配置表,并配上中文文案。接口新增主题时,通过 action=types 做一次全量比对,自动发现差异并告警。

2. 对随机性建立正确预期

既然是随机接口,两次请求返回相同内容的情况必然存在。若要保证展示不重复,需要在本地维护最近 N 首诗词的特征值(如标题 + 作者),做去重过滤。

3. 缓存与降级策略

"每日一诗"这类场景对实时性要求不高,可以在服务端按主题缓存 24 小时,只保留一首。若接口不可用,用本地静态诗词兜底,保证页面不空白。

4. 集中式配额保护

由于 QPS 限制是接口级的,建议在网关或调用层统一做限流,而不是让每个业务模块各自直接发起请求。这样做的另一个好处是:当接口升级或迁移时,只需要改一处调用地址。

参考文档

  • 文档页:https://apizero.cn/aidocs/shici
  • 原始文档:https://apizero.cn/aidocs/shici/raw.md