直接调用第三方api易致代码腐烂,因接口频繁变动(字段、结构、认证、错误码),硬编码调用需全局替换且易遗漏;适配器模式将变化隔离,业务代码仅依赖统一接口,由适配器消化差异,确保可维护性与稳定性。

为什么直接调用第三方API容易导致代码腐烂
第三方API接口变动频繁,字段名、返回结构、认证方式、错误码都可能随时调整。一旦多个地方硬编码了 requests.get("https://api.x.com/v2/user") 这类调用,后续改一个接口就得全局搜替换,还容易漏掉边界情况(比如分页逻辑或重试策略不一致)。
适配器模式不是为“设计感”加的,是为把变化关进笼子:让业务代码只和你定义的 UserClient.get_profile() 打交道,而具体怎么跟微信、飞书、钉钉的API通信,全由适配器内部消化。
如何写一个最小可行的适配器基类
核心就三点:统一输入、统一输出、强制实现关键方法。别一上来就抽象工厂或泛型,先保证能跑通。
适配器基类只需声明必须实现的方法,用 NotImplementedError 拦住遗漏:
class BaseUserAdapter:
def get_user_by_id(self, user_id: str) -> dict:
raise NotImplementedError
def list_users(self, offset: int = 0, limit: int = 100) -> list[dict]:
raise NotImplementedError
注意两点:
- 返回类型明确是
dict或list[dict],不返回原始requests.Response对象——那是适配器自己该处理的细节 - 参数避免带第三方特有字段,比如不叫
open_id而叫user_id;不暴露access_token给上层,由适配器自己从配置或上下文取
微信企业微信适配器的实际写法
微信API返回结构嵌套深、字段名带下划线、错误信息藏在 errcode 字段里,飞书却是 code + msg,钉钉用 ErrorCode。适配器要干的就是把这些差异抹平。
关键操作:
调用 Cutout.Pro 视觉处理 API 进行背景移除、人像抠图和照片增强,支持文件上传与图片 URL 输入。
- 把
errcode != 0统一转成抛出APIError异常,业务层不用再写if resp.json().get("errcode"): - 把微信的
{"userid": "zhangsan", "name": "张三"}映射成标准字段{"user_id": "zhangsan", "name": "张三"} - 自动拼接
access_token查询参数,而不是让调用方每次传
示例片段(省略认证获取逻辑):
class WeComUserAdapter(BaseUserAdapter):
def __init__(self, corp_id: str, secret: str):
self._corp_id = corp_id
self._secret = secret
self._access_token = None
def get_user_by_id(self, user_id: str) -> dict:
url = f"https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token={self._get_access_token()}&userid={user_id}"
resp = requests.get(url)
data = resp.json()
if data.get("errcode") != 0:
raise APIError(f"WeCom API error: {data.get('errmsg')}")
return {
"user_id": data["userid"],
"name": data["name"],
"email": data.get("email", ""),
}
适配器注入到业务逻辑时最容易踩的坑 最常见问题是把适配器当成工具函数来用,结果在每个 service 里 new 一次,导致 token 重复获取、HTTP 连接没复用、日志埋点分散。
正确做法:
- 用依赖注入(如
fastapi.Depends或手动传实例),确保整个请求生命周期内复用同一个适配器实例 - 适配器内部缓存
access_token,并加锁防止并发刷新;别让_get_access_token()每次都走网络 - 不要在适配器里做业务判断,比如 “如果用户邮箱为空就跳过同步”,那是 service 层的事;适配器只负责“拿数据”和“格式转换”
- 日志打在适配器内部,但用统一前缀,比如
[wecom-adapter],方便 grep 追踪
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










