如何避免循环调用API?Python程序接收API变更通知方案咨询
可行方案汇总
1. API主动通知(最优解)
如果目标公开API支持Webhook,这是最省心的方案:
- 用Flask/FastAPI给你的Python程序写一个可公网访问的简单接口,作为接收通知的端点。
- 在API的后台配置这个Webhook地址,指定你关心的数据变更触发条件。
- 一旦API数据更新,会主动把新数据POST到你的端点,你直接在端点里处理即可,完全不用主动轮询。
2. 利用HTTP缓存头减少无效请求
如果API不支持Webhook,用HTTP协议自带的缓存机制优化轮询:
- 第一次请求后,记录响应头里的
ETag或Last-Modified值。 - 后续请求时,在请求头里带上
If-None-Match: <ETag值>或If-Modified-Since: <Last-Modified值>。 - 数据没变化时,API会返回
304 Not Modified状态码,你不用解析响应体,直接跳过处理逻辑。 - 示例代码:
import requests import time target_url = "https://目标API地址" request_headers = {} while True: res = requests.get(target_url, headers=request_headers) if res.status_code == 304: # 数据未变更,临时延长等待间隔 time.sleep(30) else: # 数据更新,处理新内容 new_data = res.json() print("检测到数据更新:", new_data) # 更新缓存标识,用于下一次请求 if "ETag" in res.headers: request_headers["If-None-Match"] = res.headers["ETag"] if "Last-Modified" in res.headers: request_headers["If-Modified-Since"] = res.headers["Last-Modified"] time.sleep(5)
3. 自适应轮询策略
如果API连缓存头都不支持,自己实现智能等待逻辑:
- 初始用5秒间隔轮询,每次对比返回数据是否和上次一致。
- 当连续多次(比如120次,对应10分钟)返回相同数据时,逐步延长等待间隔(比如从5秒升到30秒、1分钟,直到最大间隔)。
- 一旦检测到数据变化,立刻恢复短间隔轮询。
- 核心逻辑示例:
import requests import time target_url = "https://目标API地址" last_result = None same_count = 0 min_wait = 5 max_wait = 600 # 最大等待10分钟 while True: res = requests.get(target_url) current_result = res.json() if current_result == last_result: same_count += 1 # 按连续相同次数动态调整等待时间 wait_time = min(min_wait * (2 ** (same_count // 20)), max_wait) else: same_count = 0 wait_time = min_wait last_result = current_result print("检测到数据更新:", current_result) time.sleep(wait_time)
注意事项
- 用Webhook时要确保你的接收端点有稳定公网访问能力,测试阶段可以用内网穿透工具临时打通。
- 自适应轮询要设置最大等待间隔,避免长时间不检查错过关键更新。
- 所有方案都要加异常处理,比如捕获请求超时、API返回5xx错误的情况,防止程序崩溃。
内容的提问来源于stack exchange,提问作者baptiste
相关产品推荐
相关产品推荐

