如何以Pythonic风格存储API端点?API封装器开发问询
哈哈,这种大量API端点堆在一起维护的痛苦我太懂了!之前做支付API封装的时候也踩过类似的坑,给你分享几个我实践下来好用的规整方案,你可以根据自己的项目规模选:
方案1:用嵌套类结构化管理端点
这种方式最直观,把不同模块的端点按类分组,层级清晰,修改起来也只需要动一处:
class APIEndpoints: # 基础配置只写一次 HOST = "https://wallet.shiftnrg.org" BASE_API = f"{HOST}/api" # 按业务模块拆分,比如Accounts组 class Accounts: MODULE_BASE = f"{APIEndpoints.BASE_API}/accounts" OPEN = f"{MODULE_BASE}/open" BALANCE = f"{MODULE_BASE}/balance" TRANSFER = f"{MODULE_BASE}/transfer" # 新增端点直接在这里加就行 # 再比如Loader组 class Loader: MODULE_BASE = f"{APIEndpoints.BASE_API}/loader" STATUS = f"{MODULE_BASE}/status" REFRESH = f"{MODULE_BASE}/refresh" # 使用的时候直接调用,可读性拉满 print(APIEndpoints.Accounts.OPEN)
优点:结构清晰,找端点不用翻一堆常量;修改HOST或者基础路径时,只需要改顶层的HOST或BASE_API,所有子端点自动更新;新增模块直接加嵌套类就行,扩展性强。
方案2:配置文件+模板解析(适合多环境切换)
如果你的API需要在开发、测试、生产等不同环境切换,把端点模板写到配置文件里会更灵活,不用动代码就能换环境:
先写一个endpoints.yaml配置文件:
host: "https://wallet.shiftnrg.org" base_path: "/api" modules: accounts: base: "${base_path}/accounts" open: "${accounts.base}/open" balance: "${accounts.base}/balance" loader: base: "${base_path}/loader" status: "${loader.base}/status"
然后用Python读取并解析模板:
import yaml from string import Template def load_endpoints(config_path="endpoints.yaml"): with open(config_path, "r") as f: config = yaml.safe_load(f) # 先构建基础上下文 context = { "host": config["host"], "base_path": f"{config['host']}{config['base_path']}" } # 递归解析所有端点模板 def resolve_template(data, current_context): if isinstance(data, dict): resolved = {} for key, value in data.items(): if isinstance(value, str): resolved[key] = Template(value).substitute(current_context) else: resolved[key] = resolve_template(value, {**current_context, **resolved}) return resolved return data return resolve_template(config["modules"], context) # 使用示例 endpoints = load_endpoints() print(endpoints["accounts"]["open"])
优点:配置和代码完全分离,切换环境只需要换配置文件;可以把敏感信息(比如不同环境的host)放到配置里,不用硬编码在代码中。
方案3:封装成API客户端类(终极方案)
如果你的API封装器需要处理请求头、超时、异常统一捕获等逻辑,直接把端点封装成客户端的方法会更专业,调用的时候完全不用关心URL:
import requests class ShiftNRGAPIClient: def __init__(self, host="https://wallet.shiftnrg.org", timeout=10): self.host = host self.session = requests.Session() self.session.timeout = timeout # 可以在这里统一设置默认headers,比如授权token # self.session.headers.update({"Authorization": "Bearer YOUR_TOKEN"}) def _build_url(self, path): return f"{self.host}/api{path}" # Accounts模块的方法 def open_account(self, user_data): """创建新账户""" url = self._build_url("/accounts/open") return self.session.post(url, json=user_data) def get_account_balance(self, account_address): """获取账户余额""" url = self._build_url(f"/accounts/{account_address}/balance") return self.session.get(url) # Loader模块的方法 def get_loader_status(self): """获取加载器状态""" url = self._build_url("/loader/status") return self.session.get(url) # 使用示例 client = ShiftNRGAPIClient() response = client.open_account({"username": "test_user", "email": "test@example.com"}) if response.ok: print("账户创建成功:", response.json())
优点:把URL拼接逻辑完全封装在内部,调用者只需要关心业务方法;可以统一处理请求的公共逻辑(比如重试、异常捕获、日志);代码可读性和可维护性最高,适合大型项目。
内容的提问来源于stack exchange,提问作者strontiux
相关产品推荐
相关产品推荐

