You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:43:44