如何自动适配动态变更的URL 无需手动修改即可发起API调用
动态版本参数接口适配方案
URL中随价格更新自动变化的_ver=t*格式参数是WordPress站点常用的缓存控制参数,值会随站点内容更新同步变化,硬编码URL必然会随更新失效,按以下方案处理即可:
方案1:移除可变参数(优先验证)
绝大多数WordPress站点的_ver参数仅用于控制浏览器缓存,服务端不会校验该参数的合法性,不传该参数就能直接拿到最新数据,不需要额外做动态提取。
修改后的代码如下:
import requests from datetime import datetime # 固定接口地址,和可变参数拆分 API_BASE = "https://lirarate.org/wp-json/lirarate/v2/rates" def LiraRateApiCall(): # 仅传入固定必传的查询参数 req_params = {"currency": "LBP"} resp = requests.get(API_BASE, params=req_params) resp.raise_for_status() data = resp.json() timestamp = data['buy'][-1][0] / 1000 date_fmt = '%d/%m/%y' update_date = datetime.fromtimestamp(timestamp) buy_rate = data['buy'][-1][1] print(update_date.strftime(date_fmt)) print(buy_rate) return (update_date.strftime(date_fmt), buy_rate)
方案2:页面动态提取版本参数(方案1失效时使用)
如果测试发现不传_ver会被服务端拦截,就先请求站点首页,从页面源码中正则匹配出最新的_ver值,再拼接参数发起请求,全程不需要手动抓包改代码。
实现代码:
import requests import re from datetime import datetime API_BASE = "https://lirarate.org/wp-json/lirarate/v2/rates" SITE_HOME = "https://lirarate.org" def fetch_latest_ver(): page_resp = requests.get(SITE_HOME) page_resp.raise_for_status() # 从页面源码匹配_ver参数值 ver_match = re.search(r'_ver=(t\d+)', page_resp.text) if not ver_match: raise RuntimeError("无法提取最新接口版本参数") return ver_match.group(1) def LiraRateApiCall(): req_params = { "currency": "LBP", "_ver": fetch_latest_ver() } resp = requests.get(API_BASE, params=req_params) resp.raise_for_status() data = resp.json() timestamp = data['buy'][-1][0] / 1000 date_fmt = '%d/%m/%y' update_date = datetime.fromtimestamp(timestamp) buy_rate = data['buy'][-1][1] print(update_date.strftime(date_fmt)) print(buy_rate) return (update_date.strftime(date_fmt), buy_rate)
注意事项
- 调用
requests.get()时通过params传参比手动拼接URL更稳妥,特殊字符会自动转义,参数调整也更方便 - 新增的
resp.raise_for_status()会在接口返回4xx/5xx错误时直接抛出异常,避免后续JSON解析出现无意义报错 - 方案1测试通过的话不需要用方案2,性能更好,也少一次HTTP请求
内容的提问来源于stack exchange,提问作者kevin
相关产品推荐
相关产品推荐

