引言
使用场景
该 API 适用于以下典型场景:
- 企业考勤与排班系统:自动识别工作日与调休日,避免人工维护假日表。
- 节假日提醒应用:在日期接近假期时向用户推送通知。
- 日历插件或提醒服务:动态获取未来年份的放假日期,用于 UI 展示或逻辑判断。
- 数据分析:统计节假日对业务量的影响,例如电商大促期间的流量波动。
接口能力边界
| 项目 | 说明 |
|---|---|
| 接口名称 | 中国法定节假日 |
| slug | holiday |
| 请求方法 | GET |
| 请求地址 | https://v1.apizero.cn/api/holiday |
| 覆盖范围 | 2020–2030 年 |
| QPS 限制 | 20 次/秒 |
| 鉴权方式 | 在 HTTP 头X-API-Key中传递 API Key |
| 返回格式 | JSON |
该接口仅支持查询全部年份的节假日安排,不支持按年份或月份过滤。如需要按特定年份查询,需在客户端侧对返回结果自行过滤。
请求参数与鉴权
参数
本接口没有任何 URL 查询参数(Query String),所有请求均通过 GET 方法发送至固定端点。
鉴权
调用时必须携带X-API-Key请求头,值为申请到的 API Key(由字母数字组成)。如果缺少该头或 Key 无效,服务端会返回 401 错误。
RESTful 风格示例:
GET /api/holiday HTTP/1.1 Host: v1.apizero.cn X-API-Key: YOUR_API_KEY_HERE最小可运行 curl 示例
以下 curl 命令可以直接在终端中执行(请将YOUR_API_KEY_HERE替换为实际 Key):
curl -sS \ -X GET \ -H "X-API-Key: YOUR_API_KEY_HERE" \ "https://v1.apizero.cn/api/holiday"-sS表示静默模式但保留错误输出;-X GET显式指定 HTTP 方法(GET 为默认值,可省略);-H添加自定义请求头。
执行成功后将返回类似以下内容(已格式化):
{ "code": 200, "message": "success", "data": [ { "date": "2024-01-01", "name": "元旦", "isOffDay": true, "holiday": "元旦" }, { "date": "2024-01-02", "name": "元旦", "isOffDay": false, "holiday": "元旦" } ] }注意:以上
data数组中的字段(如isOffDay、holiday)仅为示例推测,实际返回结构请以官方文档为准。本文重点演示调用流程,不保证字段名称完全匹配。
代码接入示例(Python)
为了体现“最小可运行”,下面给出一个 Python 脚本,仅依赖标准库urllib.request,无需第三方包:
import json import urllib.request API_URL = "https://v1.apizero.cn/api/holiday" API_KEY = "YOUR_API_KEY_HERE" # 替换为真实 Key req = urllib.request.Request(API_URL) req.add_header("X-API-Key", API_KEY) try: with urllib.request.urlopen(req) as response: data = json.loads(response.read().decode()) print("状态码:", data.get("code")) print("消息:", data.get("message")) # data.get("data") 为节假日列表 holidays = data.get("data", []) for item in holidays[:5]: # 打印前5条 print(item) except urllib.error.HTTPError as e: print("HTTP错误:", e.code, e.reason) except Exception as e: print("其他错误:", e)运行该脚本,如果 Key 有效,会输出类似:
状态码: 200 消息: success {'date': '2024-01-01', 'name': '元旦', 'isOffDay': True, 'holiday': '元旦'} ...拓展:使用 requests 库(更简洁)
若项目已安装requests,代码可以更精简:
import requests resp = requests.get( "https://v1.apizero.cn/api/holiday", headers={"X-API-Key": "YOUR_API_KEY_HERE"} ) resp.raise_for_status() # 非 200 将抛出异常 result = resp.json() print(result)返回值结构解读
成功响应的 JSON 顶层包含三个字段:
| 字段 | 类型 | 说明 |
|---|---|---|
code | int | 业务状态码,200 表示成功 |
message | string | 状态描述,成功时为"success" |
data | array | 节假日数据列表,每个元素是一个对象 |
data数组中的每个对象代表一天(放假或调休),具体字段以官方文档说明为准。按照常见实践,这些字段可能包括:
date:日期字符串,格式YYYY-MM-DDname:节日名称(如 "元旦")isOffDay:是否放假(true表示放假,false表示调休上班)holiday:所属节日名称(与name可能相同,或为 "元旦"、"春节" 等)
如需判断某天是否为工作日,可以遍历data并根据isOffDay判断。若某天不在列表中,则默认视为工作日。
常见错误处理
| HTTP 状态码 | 可能原因 | 排查思路 |
|---|---|---|
| 401 | API Key 缺失或无效 | 检查X-API-Key头是否正确设置;确认 Key 未过期。 |
| 403 | 请求被拒绝 | 可能 IP 被限制或调用超过 QPS 上限。 |
| 429 | 请求过于频繁 | 降低调用频率,QPS 限制为 20,建议加本地重试及指数退避。 |
| 500 | 服务端内部错误 | 稍后重试,若持续出现可反馈给平台。 |
在代码中应该捕获urllib.error.HTTPError(或requests.exceptions.HTTPError)并根据状态码做出相应处理。
工程化注意事项
1. API Key 管理
- 不要将 Key 硬编码在代码仓库中,应通过环境变量或配置服务注入。
- 示例配置(.env):
HOLIDAY_API_KEY=your_key_here - 在代码中读取:
os.getenv("HOLIDAY_API_KEY")
2. 缓存策略
节假日数据在较长周期内(一年)不会变更,且接口返回全量数据,非常适合缓存。建议:
- 缓存时长:至少 1 小时,甚至可以按天缓存。
- 缓存介质:对于单机应用可用内存或本地文件;对于分布式服务可用 Redis。
- 更新时机:每年年底新假期公布时手动或定时刷新一次缓存。
3. 重试与熔断
当遇到 5xx 错误或网络超时时,应实现重试机制。推荐采用指数退避(Exponential Backoff),例如重试 3 次,间隔分别为 1s、4s、9s。同时注意不要超过 QPS 限制。
4. 数据校验
接口返回的data可能包含 500+ 条记录,建议在消费前校验code是否为 200,并检查data是否为列表。避免因数据异常导致程序意外中断。
5. 时间处理
返回的日期字符串统一为YYYY-MM-DD格式,使用时建议转换为datetime.date对象以便比较。如果涉及时区(中国使用东八区),需确保服务器时间设置正确。
总结
本文通过一个最小可运行的 curl 命令,演示了中国法定节假日 API 的调用方法。随后扩展了 Python 代码示例,并详细解析了返回结构、错误处理及工程化注意事项。该接口数据稳定、调用简单,适合快速集成到各类日历、排班项目中。开发者无需手动维护假日表,只需关注业务逻辑即可。
参考文档
- 官方文档页:https://apizero.cn/aidocs/holiday
- 原始 Markdown 文档:https://apizero.cn/aidocs/holiday/raw.md
- API 基础地址:
https://v1.apizero.cn/api/holiday - 鉴权方式:HTTP Header
X-API-Key
请务必查阅官方文档以获取最新的字段定义和更新日志。