跳至主要内容

接口契约是什么:为什么协作要先讲清输入、输出和边界

接口契约是什么:为什么协作要先讲清输入、输出和边界

摘要

接口契约,是系统、模块或团队之间对输入、输出、行为和边界的明确约定。它不只是 API 文档里的字段说明,也是一种协作方式。契约越清楚,双方越少靠猜测工作;契约越模糊,问题越容易在边界处爆发。好的接口契约能降低沟通成本、测试成本和变更风险。

接口为什么需要契约

接口存在的原因,是让不同部分可以独立工作。前端调用后端,服务调用服务,团队交付团队,都需要某种接口。

但接口如果只有名字,没有契约,就会变成猜谜。调用方不知道哪些字段必填,返回值什么时候为空,错误如何表达,版本变化是否兼容;提供方也不知道调用方依赖哪些行为。

契约的价值,就是把隐含期待写清楚。

输入要讲清楚

输入契约回答的是:对方可以给我什么。

字段类型、必填规则、格式限制、边界值、默认值、权限要求,都属于输入契约的一部分。很多错误不是业务逻辑错,而是输入预期没有对齐。

比如一个时间字段,到底接受本地时间还是 UTC?一个状态字段是否允许未知值?一个列表为空时表示没有数据,还是参数无效?

这些看似细节,却会决定系统是否稳定。

输出也要稳定

输出契约回答的是:我承诺返回什么。

调用方最怕的不是错误,而是不稳定。今天返回字符串,明天返回对象;成功时有字段,失败时字段消失;列表顺序没有说明,却被业务依赖。这样的接口会让使用方不断补丁式适配。

好的输出契约,要让调用方知道正常结果、空结果、异常结果分别长什么样。

稳定输出是一种信任。

错误也是契约的一部分

很多接口设计只认真设计成功路径,却忽略错误路径。结果一出问题,调用方只能靠文本猜测原因。

错误契约应该说明错误码、错误信息、是否可重试、用户是否可见、调用方应该如何处理。

例如,权限不足、参数错误、资源不存在、系统繁忙,是完全不同的错误。如果都返回一个“失败”,调用方就无法做出正确响应。

错误处理越清楚,系统越不容易在异常时混乱。

边界比功能更重要

接口契约还要讲清楚不负责什么。

一个接口是否负责校验权限?是否负责创建缺失资源?是否保证幂等?是否会触发通知?是否可以被外部重复调用?

边界不清,责任就会漂移。出了问题,双方都会觉得“这不是我该处理的吗?”

好的契约不仅定义能力,也定义责任边界。

契约变化要谨慎

接口一旦被使用,就会形成依赖。改变契约,不只是改一段代码,而是在改变别人的预期。

因此契约变更要考虑兼容性、版本、迁移时间和通知机制。能新增就尽量不要破坏旧字段;必须破坏时,要给调用方足够时间和清楚说明。

成熟系统不是不变化,而是让变化可预期。

契约不是文档形式主义

接口文档当然重要,但契约不应该只存在文档里。类型定义、测试用例、示例请求、错误码规范、监控指标,都是契约的不同表达。

如果文档写一套,代码跑一套,真正的契约就是代码行为。团队要做的,是让文档、测试和运行行为尽量一致。

契约越可验证,越可靠。

结论

接口契约的本质,是在协作边界上建立清楚预期。它让双方知道输入是什么、输出是什么、异常如何处理、责任在哪里。工程协作的很多问题,并不是能力不足,而是契约不清。把契约讲清楚,系统和团队都会少一点猜测。

延伸阅读

评论

此博客中的热门博文

尝试解构一段幽默

  天龙八部里有这么一段情节: 乌老大脸上肌肉牵搐,又“啊啊”了几声,突然指着虚竹骂道:“臭贼秃,瘟和尚,你十八代祖宗男的都是乌龟,女的都是娼妓,你日后绝子绝孙,生下儿子没屁股,生下女儿来三条胳臂四条腿……”越骂越奇,口沫横飞,当真愤怒已极,骂到后来牵动伤口,太过疼痛,这才住口。 虚竹叹道:“我是和尚,自然绝子绝孙,既然绝子绝孙了,有什么没屁股没胳臂的?”

《微信公开课》上张小龙的公开演讲

 微信是一款现象级的互联网产品,至少以互联网产品普遍的生命周期看来,微信是一款跨越了生命周期的互联网产品。要想理解微信在产品实践的一些观念,最好的方法莫过于直接和他们对话,阅读他们的书就是一种最直接的精神交流。 前几年流传着一本奇书《微信背后的产品观》,互联网产品从业者都给出了极高的评价,书里的内容大致上来自于 2012 年微信团队内部的一次分享会。而在现在,微信依然是一个具有生命力和健康生态的互联网产品,我们又该用什么方式来继续更新对微信的认识呢? 我的方法是:从微信张小龙过去几年的公开课中学习微信的产品观

你日常爱用的词语,竟有这么多在压抑自我!为什么“夹带私货”是一种很愚蠢的说法?所谓“精致利己主义者”其实很粗糙|心理|哲学|历史|自我成长