适用场景
在诗词学习App、智能屏幕、语音助手、文化教育类应用甚至个人博客中,经常需要随机展示一首古诗词来丰富内容。传统做法是本地维护一个庞大的诗词库,但更新和维护维护复杂度较高。通过调用随机诗词API,只需一次请求就能获得一首符合特定主题的古诗词,极大降低了存储和运维维护复杂度。
以下是一个典型场景:一个诗词爱好者小程序,首页每天展示一首“抒情”主题的诗词。后端每24小时从API获取一首并缓存到Redis,用户刷新时展示缓存内容。这种方案既保证内容新鲜,又不会因为高频调用触发限流。
接口能力边界
- 接口地址:
https://v1.apizero.cn/api/shici(仅支持POST方法) - QPS限制:5次/秒。超出后返回429状态码,需要实现退避机制。
- 主题筛选:支持以下10种主题,通过参数
type选择:- 抒情、四季、山水、天气、人物、生活、节日、动物、植物、食物
- 类型列表查询:通过参数
action: "types"可获取所有主题枚举,该操作不消耗调用额度,适合在初始化时一次性拉取。
鉴权方式
调用时需要携带X-API-Key请求头,值为你在平台申请的API Key。建议通过环境变量注入,避免硬编码。示例如下:
export APIZERO_API_KEY="your_key_here"然后在代码中读取$APIZERO_API_KEY。如果Key无效或缺失,接口返回401 Unauthorized。
请求参数详解
请求体为JSON对象,包含两个可选字段:
| 参数名 | 类型 | 必填 | 描述 |
|---|---|---|---|
| type | string | 否 | 主题标识,取值:shuqing、siji、shanshui、tianqi、renwu、shenghuo、jieri、dongwu、zhiwu、shiwu |
| action | string | 否 | 固定值"types",返回主题列表(不消耗额度) |
- 若不传任何参数,接口随机返回任意主题的一首诗词。
- 若只传
type,返回该主题的随机诗词。 - 若只传
action: "types",返回主题枚举数组。 - 同时传
type和action时,action优先级更高,仍返回主题列表,type被忽略。
curl接入示例
示例1:获取随机诗词(不指定主题)
curl -sS \ -X POST \ -H "X-API-Key: $APIZERO_API_KEY" \ -H "Content-Type: application/json" \ -d '{}' \ "https://v1.apizero.cn/api/shici"示例2:获取“山水”主题随机诗词
curl -sS \ -X POST \ -H "X-API-Key: $APIZERO_API_KEY" \ -H "Content-Type: application/json" \ -d '{"type": "shanshui"}' \ "https://v1.apizero.cn/api/shici"示例3:获取主题类型列表(不消耗额度)
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"返回结果解读
成功响应(HTTP 200)
{ "code": 200, "data": {}, "message": "success" }注意:官方文档给出的示例中data为空对象。实际调用时,data字段会包含完整的诗词信息。根据接口文档,data对象通常包含以下字段(以实际返回为准,建议通过日志或调试工具查看):
| 字段名 | 类型 | 说明 |
|---|---|---|
| title | string | 诗词标题 |
| author | string | 作者 |
| dynasty | string | 朝代 |
| paragraphs | string[] | 诗词正文(每句为数组元素) |
| type | string | 所属主题 |
类型列表响应(action=types)
{ "code": 200, "data": ["shuqing", "siji", "shanshui", ...], "message": "success" }错误响应
- 400 Bad Request:请求体格式错误(非JSON)或参数值非法。
- 401 Unauthorized:
X-API-Key缺失或无效。 - 429 Too Many Requests:超过QPS限制,应等待至少200ms后重试。
- 500 Internal Server Error:服务端异常,建议稍后重试。
工程化注意事项
1. API Key安全管理
- 不要将Key硬编码在代码仓库中。使用环境变量、配置中心或密钥管理服务。
- 在前端代码中直接调用时,Key会暴露给用户。建议由后端代理请求,前端通过自己的接口获取诗词数据。
2. 缓存策略
- 由于QPS仅有5/s,高并发场景下必须加缓存。例如:
- 定时任务:每10分钟调用一次,将结果存入Redis,设置过期时间10分钟。
- 用户请求时:先读缓存,缓存未命中再调用API并回写缓存。
- 对于非时效性场景(如每日一句),可预先缓存一批诗词,供一天使用。
3. 错误重试与降级
- 网络波动或服务端5xx错误:采用指数退避重试(如第一次等待1s,第二次2s,第三次4s),最多重试3次。
- 429限流:等待
Retry-After头指定的时间(若有)或固定2秒后重试。 - 若API持续不可用,可降级为本地备用诗词库。
4. 并发控制
- 使用信号量或队列限制同一时刻的并发请求数,避免短时间内发出超过5个请求。
- 在Node.js中可使用
p-limit库,Python中可使用Semaphore。
5. 参数校验
- 调用前对
type值进行白名单校验,避免无效值导致400错误。可借助action: "types"在应用启动时预拉取有效枚举。
6. 日志与监控
- 记录每次请求的耗时、状态码、返回内容摘要,便于排查问题。
- 监控错误率,当4xx/5xx比例超过阈值时触发告警。
参考文档
- 接口文档页:
https://apizero.cn/aidocs/shici - 原始Markdown文档:
https://apizero.cn/aidocs/shici/raw.md