当前位置: 首页 > news >正文

【API 设计之道】03 非标行为设计:当 REST 无法描述“取消订单”时怎么办?

大家好,我是Tony Bai。

欢迎来到我们的专栏 《API 设计之道:从设计模式到 Gin 工程化实现》的第三讲。

在前面两讲中,我们不仅统一了资源导向的命名规范,还用泛型封装了标准的 CRUD 控制器。一切看起来都很美好,直到有一天,产品经理走到了你的工位旁,提了一个需求:

“Tony,我们需要加一个‘取消订单’的功能。取消时要校验订单状态,退回库存,还要给用户发短信。”

这时候,你还没从上一讲的 CRUD 思维中走出来,下意识地想:

“取消订单?不就是把订单状态改成Cancelled吗?这简单!”

于是你写出了这样的代码:

// PATCH /api/v1/orders/:id { "status": "cancelled" }

你觉得这很 RESTful,很规范。但几天后,问题来了:

  • 有的开发人员直接改了数据库状态,但忘了发短信。

  • 有的在退库存时发生了错误,但订单状态却已经变更为取消了,导致数据不一致。

  • 前端同学跑来问:“为什么我把状态改成cancelled报错了?哦,原来只有pending状态才能取消啊,你不早说?”

其实,这里犯了一个典型的“过度 CRUD 化”错误。

并不是所有的业务逻辑都能(或者应该)被映射为字段的修改。对于那些副作用大、逻辑复杂、具有明确业务意图的操作,我们需要引入一种新的设计模式:自定义方法(Custom Methods)

今天这一讲,我们就来聊聊当 CRUD 不够用时,如何在 Gin 中优雅地设计“非标行为”。

为什么PATCH不是万能的?

在 API 设计中,有一条黄金法则:API 应当表达“意图”,而非仅仅暴露“数据”。

使用PATCH更新状态字段,虽然符合 REST 的字面含义,但它掩盖了业务的复杂性。

  1. 副作用(Side Effects)隐藏PATCH通常暗示着轻量级的数据字段更新。但“取消订单”可能触发一系列沉重的后端流程(退款、通知、库存释放)。将这些副作用隐藏在一个简单的字段更新背后,违背了“最小惊讶原则”。

  2. 状态机逻辑泄露:订单的状态流转通常是有严格限制的(比如只能从Pending->Cancelled)。如果使用PATCH,意味着客户端需要了解这些流转规则,否则就会收到各种不知所云的校验错误。

  3. 权限粒度难控制:如果“修改收货地址”和“取消订单”都走PATCH /orders/:id,你怎么在网关层做细粒度的权限控制?难道要解析 Body 内容吗?

http://www.cnnetsun.cn/news/10571.html

相关文章:

  • 腾讯实验室发布智能机器人导航突破:让AI像人类一样理解空间
  • 合并两个有序链表:双指针迭代法实现(C++)
  • CVPR 2025最佳论文突破:DepthCrafter实现开放世界视频深度序列生成新范式
  • MEET 2026 | 荣获双奖,AI 开源点亮智能未来
  • Wan2.2-T2V-A14B支持自动字幕嵌入吗?多语种翻译生成测试
  • Wan2.2-T2V-A14B与Sora的技术路线差异比较
  • Java两种代理模式详解
  • MySQL基础篇——约束和事务
  • 【VSCode量子编程环境搭建指南】:手把手教你5步配置Qiskit开发环境
  • Flutter深度解析:从原理到实战的全栈开发指南
  • AI开眼了!多模态大模型架构全解析,从LLaVA到Qwen3-VL,小白也能秒懂的硬核指南
  • 4.10.1计算器含负数8086 ,基于8086的简易计算器可以显示负数,减法计算时可以得出负数显示,但是小于-9以后就显示E0溢出提示
  • Wan2.2-T2V-A14B能否生成适用于VR心理暴露疗法的创伤情境
  • 数据结构-栈(核心代码)
  • 哔哩下载姬:解锁B站视频离线收藏的终极方案
  • 关于电脑端抓包小程序的3种方法,黑客技术零基础入门到精通教程
  • AMD Nitro-E:轻量级文本到图像扩散模型家族的技术突破与性能解析
  • AI学习与职业发展:一次关于证书与能力的真实思考
  • 详细描述一条 SQL 在 MySQL 中的执行过程
  • 一文读懂GLM-Edge-4B-Chat:轻量化大模型如何重塑边缘智能应用新生态
  • Ubuntu22.04 5080配置深度学习环境
  • Wan2.2-T2V-A14B在虚拟演唱会背景制作中的大规模应用
  • Windows右键菜单清理与定制全攻略:ContextMenuManager高效使用指南
  • nginx实战-PHP——day2
  • 知识扩展--从病理学角度比较来自同一组织切片的Xenium 5K与Visium HD数据
  • 基于Wan2.2-T2V-A14B的AI导演系统原型设计思路
  • 【苍穹外卖-day12】
  • 金融项目的测试过程(额度申请审核的测试点设计)
  • C# AES加密在医疗系统中的真实应用案例(含完整源码与审计建议)
  • java计算机毕业设计球鞋商城系统小程序 基于SpringBoot的潮鞋微商城小程序设计与实现 JavaWeb限量球鞋交易平台小程序开发