接口设计要从实际场景出发
很多人一上来就想着用最“标准”的方式定义接口,结果做出来的接口别人看不懂,调用起来还容易出错。比如一个订单查询接口,返回字段里夹杂着数据库的原始字段名 like_time、user_id_str,调用方一头雾水。其实接口不是炫技的地方,它更像是两个人之间的对话,得让对方听得明白。
举个例子,用户下单后查状态,接口返回的 status 字段如果是 1、2、3 这样的数字,下游服务就得翻文档对码表。但如果直接返回 pending、paid、shipped 这样的字符串,一眼就能看懂,减少沟通成本,也降低了误判风险。
使用清晰统一的命名规范
团队协作中,命名混乱是大忌。有人喜欢用下划线 user_name,有人偏爱驼峰 userName,混在一起看得很累。建议提前约定好命名风格,整个系统保持一致。
URL 路径也要有逻辑。比如 /api/v1/user/orders 比 /api/getUserOrderList 更直观。动词尽量别出现在路径里,RESTful 风格靠 HTTP 方法表达动作,GET 就是查,POST 就是增,清晰又简洁。
版本管理不能省
接口一旦上线,就不能随便改。今天把 user_name 改成 name,明天删了某个字段,调用方的服务可能当场崩溃。所以从一开始就考虑版本控制,比如在 URL 中带上 v1、v2,或者通过请求头区分版本。
升级时保留旧版本一段时间,给上下游留出迁移时间。就像地铁线路改造,不能一夜之间全停运,得并行运行一阵子。
定义明确的请求与响应结构
每个接口都应该有确定的输入输出。别让调用方猜你要什么参数。必填项、可选项、数据类型都得写清楚。
比如创建用户接口,期望接收的数据结构应该是这样的:
{
"name": "张三",
"email": "zhangsan@example.com",
"age": 28
}响应也一样,成功和失败都要有标准格式:
{
"code": 0,
"message": "success",
"data": {
"id": 1001,
"name": "张三"
}
}错误码也别随便定,全局统一规划,比如 40000-49999 表示参数错误,50000-59999 是服务内部异常,这样排查问题效率高。
安全细节藏在接口定义里
接口不是开个口子让人调就行。敏感字段要过滤,比如用户信息接口默认不返回手机号、身份证。真需要的话,通过显式参数申请,还得走权限验证。
所有接口强制 HTTPS,避免明文传输。关键操作加签名机制,防止请求被篡改。比如在请求头里带上 timestamp 和 sign,服务端校验时间窗口和签名合法性,能挡住不少恶意重放攻击。
限流策略也可以在接口层面体现。比如规定每个 appId 每秒最多调用 100 次,超了就返回 429 状态码。这样即使某个客户端出问题,也不会拖垮整个服务。
文档和代码同步更新
很多团队接口改了,文档却没动,导致新人看着过期文档调试半天。建议用 Swagger 或 OpenAPI 自动生成文档,把注解写在代码里,发布时自动同步。
文档里配上真实请求示例和响应样例,比写一堆文字说明更管用。就像菜谱,光说“适量调味”不如直接写“加盐 5 克”来得实在。