从 Android 到后端:Controller 与 RESTful 的一次彻底祛魅
文章摘要:本文系统梳理了后端开发中的核心概念认知升级过程。从Controller本质(HTTP适配层)到系统分层架构(Controller/Service/Domain/Repository),再到DTO/VO等数据传输对象的工程实践。重点剖析了RESTful的本质是资源状态表述(URL+HTTP方法+状态码+返回体),而非简单注解使用。通过对比Android开发中的Retrofit等网络请求框架
很多人一学后端,就被一堆名词包围:Controller、DTO、VO、RESTful、状态码、序列化、反序列化……
这篇文章不是讲“怎么用注解”,而是记录我一次完整的认知升级:
👉 从“会调接口”,到“看清接口本质”。
一、Controller 本质是什么?不是业务层,是接口层
一开始我问自己一个问题:
👉 Controller 到底是干嘛的?
结论非常明确:
Controller 的本质是:接口层 / 接入层 / HTTP 适配层。
它只负责一件事:
👉 把 HTTP 世界 翻译成 系统内部调用。
Controller 里应该出现的永远是:
- 路径(URL)
- 参数接收(Path / Query / Body / Header)
- 参数校验
- 调用 Service
- 返回响应
它不应该承载业务规则,更不应该操作数据库。
所以一个干净的 Controller,永远长这样:
接参数 → 校验 → 调 Service → 转 VO → 返回
二、分层的真正含义:Controller / Service / Domain
当 Controller 退回“接口层”,系统结构就自然清晰了:
Controller(接口层)
↓
Service(应用层:流程编排)
↓
Domain(领域层:业务模型 + 业务规则)
↓
Repository(基础设施:存取数据)
✔ Service 干什么?
- 业务流程编排
- 事务边界
- 调多个 Domain / Repository
- 发送事件 / MQ
👉 它是“导演”,不是“规则制定者”。
✔ Domain 干什么?
- 状态
- 约束
- 不变量
- 业务行为
👉 它是系统最稳定的“内核”。
这一步,其实和 Android 里的演进路径完全一致:
Activity → ViewModel → UseCase → Model
三、DTO / VO / Response 到底怎么理解?
结论一句话:
DTO 是统称,VO 是工程命名风格。
- Req / Request:入参 DTO
- VO / Response:出参 DTO
- ApiResponse / Result:统一响应外壳
VO 的本质是:
👉 资源状态的一种展示模型(Representation)
所以 VO 应该属于:
interfaces/http/vo
而不是 domain。
四、Controller 的注解,本质和 Retrofit 是镜像关系
Android:
@GET / @POST
@Path / @Query / @Body
Gson / Moshi Converter
后端:
@GetMapping / @PostMapping
@PathVariable / @RequestParam / @RequestBody
Jackson HttpMessageConverter
本质都是:
👉 对象 ↔ JSON
👉 自动序列化 / 反序列化
你在 Android 里天天用,只是换了个方向。
五、Parcelable 和网络序列化,根本不是一回事
这是一个非常容易混的点:
- Retrofit:JSON 序列化(网络协议)
- Intent / Bundle:Parcel 序列化(系统 Binder)
如果你:
intent.putExtra("user", user)
👉 user 必须实现 Parcelable(推荐)
但如果 user 只是网络请求体 / 返回体:
👉 完全不需要 Parcelable。
工程最佳实践是:
- 页面跳转只传 id
- 数据重新从 Repository 加载
这和后端“Controller 只接 id,不接整个 Domain”是一个思想。
六、RESTful 真正是什么?一次彻底祛魅
RESTful 从来不是:
❌ @RestController
❌ 背 GET/POST
❌ 背 200/500
RESTful 本质只有四个要素:
1️⃣ 路径(URL)——资源是什么
/users
/orders/99
/users/1/orders
2️⃣ 方法(HTTP Method)——对资源干什么
GET / POST / PUT / DELETE
3️⃣ 状态码(Status Code)——结果性质
200 成功
4xx 你错了
5xx 我炸了
4️⃣ 返回体(Representation)——资源当前状态
{
"id": 1,
"status": "ACTIVE"
}
👉 返回的不是“接口结果”,而是资源当前状态的表示。
这也是 REST 全名真正的含义:
Representational State Transfer
👉 表述性的 · 状态 · 转移
七、状态码真正的定位
HTTP 状态码不是业务码。
它回答的是:
👉 这次请求,在协议层是成功还是失败?
- 4xx:调用方问题
- 5xx:服务端问题
- 2xx:请求处理成功(业务成败另说)
工程中常见做法是:
- HTTP 状态码表达“谁的错”
- 业务 code 表达“发生了什么”
八、为什么说 RESTful 被“吹过头了”?
因为它本质解决的是:
- 👉 接口混乱
- 👉 系统难理解
- 👉 长期不可维护
RESTful 不是“高深架构”,它是:
👉 接口世界的秩序设计。
当你看穿它之后,它会从:
“神秘名词”
变成:
“工程习惯”。
这一步,就是技术祛魅。
九、最后的统一公式(后端 + Android 通用)
只要数据离开当前内存空间(网络 / Binder / 存储),
就一定发生:序列化 → 传输 → 反序列化
十、结语:真正重要的不是 REST,是“拆解能力”
这次对 Controller 和 RESTful 的理解,本质不是学新技术,而是完成了一次:
👉 从“用 API”,到“设计系统”的认知升级。
当一个概念能被拆成要素、落成结构、指导代码时,
它就不再是“光环”,而是“工具”。
这一步,叫:祛魅。
更多推荐



所有评论(0)