一、API设计核心原则
1. RESTful风格优先
- 采用HTTP动词(GET/POST/PUT/DELETE)对应资源操作,路径清晰(如`/api/orders/{id}`),符合行业通用规范。
- 状态码标准化(如200成功、400参数错误、404资源不存在、500服务器错误),便于前端快速定位问题。
2. 版本控制
- 通过URL路径(如`/v1/api/products`)或请求头(`Accept-Version: v1`)实现接口版本管理,避免兼容性风险。
- 旧版本保留期明确(如6个月),逐步淘汰并提前通知合作伙伴。
3. 安全性设计
- 认证授权:集成OAuth2.0或JWT,区分用户角色(如采购员、供应商、管理员)的权限。
- 数据加密:敏感信息(如用户地址、支付信息)通过HTTPS传输,必要时对字段加密(如AES)。
- 限流防刷:基于IP或用户ID的请求频率限制(如QPS≤100),防止恶意攻击。
二、生鲜业务场景的API设计实践
1. 商品管理接口
- 分页查询:支持按品类、价格区间、库存状态筛选,返回结构化数据(如`{total: 100, items: [...]}`)。
- 实时库存同步:通过WebSocket或长轮询推送库存变更,确保订单系统与库存数据一致。
- 示例:
```http
GET /api/v1/products?category=vegetables&min_price=10&page=1
```
2. 订单生命周期接口
- 状态机设计:明确订单状态流转(待支付→已支付→配送中→已完成),每个状态变更触发对应API。
- 异步通知:订单状态变更时通过回调接口通知第三方系统(如物流平台)。
- 示例:
```http
POST /api/v1/orders/{id}/cancel 取消订单
GET /api/v1/orders/{id}/track 查询物流轨迹
```
3. 供应商对接接口
- 标准化数据格式:统一商品编码(如SKU)、计量单位(kg/箱),避免歧义。
- 批量操作:支持供应商批量上传库存或价格(如CSV文件解析)。
- 示例:
```http
POST /api/v1/suppliers/{id}/inventory-update
Content-Type: multipart/form-data
```
三、性能与扩展性优化
1. 缓存策略
- 对高频查询接口(如商品列表)设置Redis缓存,TTL根据业务需求调整(如5分钟)。
- 使用ETag或Last-Modified实现条件请求,减少重复数据传输。
2. 异步处理
- 非实时操作(如订单导出、数据同步)通过消息队列(如RabbitMQ)解耦,返回任务ID供前端查询进度。
- 示例:
```http
POST /api/v1/tasks/export-orders
Response: {"task_id": "12345", "status": "pending"}
```
3. 数据分片与限流
- 对大数据量接口(如历史订单查询)支持分页和时间范围筛选。
- 使用令牌桶算法限制接口调用频率,防止系统过载。
四、监控与运维
1. 日志与追踪
- 记录请求参数、响应时间及错误信息,通过ELK或Sentry集中分析。
- 集成分布式追踪(如Zipkin)定位跨服务调用瓶颈。
2. 健康检查
- 提供`/health`端点返回服务状态,供K8s探针或监控系统使用。
- 关键接口设置熔断机制(如Hystrix),避免雪崩效应。
3. 文档与测试
- 使用Swagger或OpenAPI生成交互式文档,支持Mock数据测试。
- 自动化测试覆盖边界条件(如空参数、超长字符串)。
五、案例:美菜API设计实践
- 场景:餐饮客户通过APP下单,需实时获取库存和价格。
- 设计:
1. 前端调用`GET /api/v1/products?category=meat`获取商品列表。
2. 后端返回库存字段`stock: 50`,若库存不足则标记`low_stock: true`。
3. 订单提交时调用`POST /api/v1/orders`,后端校验库存并扣减,失败时返回`409 Conflict`。
- 优化:
- 对高频商品缓存至Redis,TTL设为1分钟。
- 库存变更通过WebSocket主动推送至客户端,减少轮询。
五、总结
美菜生鲜系统的API设计需兼顾业务复杂性(如生鲜保质期、供应链协同)和技术可扩展性(如微服务架构)。通过RESTful规范、版本控制、异步处理及严密监控,可构建高可用、易维护的接口生态,支撑餐饮供应链的高效运转。