← 返回首页

把接口设计成长期可维护的契约

从资源命名、错误结构到版本演进,整理一套稳定的接口设计方法。

这周和前端对接口,会议开到一半,大家忽然沉默了。

同样是列表,订单页用 page_size,用户页叫 limit;同样是没找到数据,一个接口返回 404,另一个却返回 200,再往数据里塞一句“记录不存在”。这些东西单独看都能用,凑在一起就像几个人各写各的方言。

我翻出最早那批接口,发现不少都是赶进度时留下的。那时总觉得先跑起来最重要,后来才明白,接口一旦有人调用,随手起的字段名也会变成不能轻易拆掉的墙。

少一点临场发挥

我们先定了几条很小的规矩:路径只说资源,动作交给请求方法;列表统一使用 pagepage_sizesort;分页信息放在固定位置。

查询订单写成 GET /orders/{id},创建订单使用 POST /orders。没有追求多漂亮,只求下次写新接口时,不需要重新猜一套名字。

错误响应也收拾成了同一种样子:

{
  "code": "ORDER_NOT_FOUND",
  "message": "订单不存在",
  "request_id": "req_8f31"
}

业务码留给程序判断,提示信息给人看,请求标识则方便我半夜查日志。以前客户端会直接匹配错误文案,服务端改个标点都能出问题,现在总算不用这么提心吊胆。

给以后留条路

最难处理的是旧接口。新增可选字段通常还算安全,删字段、换类型却会牵出一串调用方。我们没有一口气重做,而是先记录旧版本的访问情况,让新旧版本并行一阵,再逐个迁移。

整理完那天,规范文档其实只有一页。比起写一本没人读的手册,我更愿意守住几条大家记得住的规矩。

接口很像站台上的时刻表。字不必华丽,但要稳定。有人照着它赶路,就不能今天写东边,明天又悄悄挪到西边。