RESTful 是什么?怎么记住它?
一、一句话本质
RESTful 就是用 URL 表示资源,用 HTTP 方法表示操作,用状态码表示结果。
它不是一门技术,也不是一个框架,而是一种接口设计风格 。核心就一句话:URL 里只放名词,动词交给 HTTP 方法。
二、用一个比喻记住
把后端系统想象成一个仓库,里面存放着各种货物(资源)。
- URL 是货物的货架编号 ,比如
/users是用户货架,/users/1是 1 号用户。 - HTTP 方法 是你对货物做的动作 :
GET:看一眼货架上有什么(查询)POST:往货架上放一件新货(创建)PUT:把某件货整个换掉(全量更新)PATCH:只改货物的某个标签(部分更新)DELETE:把货从货架上拿走(删除)
- 状态码 是仓库管理员给你的回执:200 表示办好了,201 表示新货上架了,404 表示货架上没这件货,400 表示你给的信息不对。
关键点 :货架编号(URL)永远不变,变的是你对它做的动作(HTTP 方法)。同一个 /users/1,GET 是查,PUT 是改,DELETE 是删。
三、对比传统写法,一眼看懂
| 传统写法(动词在 URL 里) | RESTful 写法(动词在方法里) |
|---|---|
GET /getUser?id=1 |
GET /users/1 |
POST /addUser |
POST /users |
POST /updateUser |
PUT /users/1 |
GET /deleteUser?id=1 |
DELETE /users/1 |
GET /getUserList |
GET /users |
传统写法把动作写进了 URL,RESTful 把动作交给了 HTTP 方法。URL 只负责"找谁",方法负责"干什么"。
四、怎么记住?记四句话
第一句:URL 是名词,不是动词。
看到 /getUser、/addOrder、/deleteItem 这种带动词的 URL,就知道不是 RESTful。RESTful 的 URL 长这样:/users、/orders、/items。
第二句:集合用复数,单个带 ID。
/users 是用户集合,/users/1 是集合里的 1 号用户。不要写 /user,复数更符合"集合"的语义。
第三句:方法定动作,查增改删。
GET 查、POST 增、PUT 改、DELETE 删。记不住就背"查增改删"四个字,对应 GET、POST、PUT、DELETE。
第四句:状态码说话,别总返回 200。
创建成功返回 201,删除成功返回 204,参数错了返回 400,没权限返回 403,找不到返回 404,服务器挂了返回 500。状态码本身就是一种"语法"。
五、一个最小例子,串起来记
java
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping // GET /users 查列表
public List<User> list() { }
@GetMapping("/{id}") // GET /users/1 查单个
public User get(@PathVariable Long id) { }
@PostMapping // POST /users 创建
public User create(@RequestBody User user) { }
@PutMapping("/{id}") // PUT /users/1 全量更新
public User update(@PathVariable Long id, @RequestBody User user) { }
@DeleteMapping("/{id}") // DELETE /users/1 删除
public void delete(@PathVariable Long id) { }
}
记住这个例子:一个 /users,五个方法,覆盖增删改查。 URL 基本不变,方法决定操作。
六、常见误区,帮你避坑
误区一:RESTful 就是返回 JSON。
不对。RESTful 是设计风格,返回 JSON 只是常见做法。返回 XML、HTML 也可以,关键是 URL 和方法的设计。
误区二:URL 里不能有动词。
不是绝对。有些操作无法映射到 CRUD,比如"取消订单""审核通过",可以用 POST /orders/1/cancel 这种子资源动作。但核心的增删改查,尽量用 HTTP 方法表达。
误区三:必须用 PUT,不能用 POST 更新。
理论上 PUT 是全量更新,PATCH 是部分更新,但实际项目中很多团队用 POST 做更新,只要团队约定一致,也能跑。RESTful 是风格,不是法律。
误区四:状态码必须严格。
理想情况下用 201、204、400、404 这些,但很多项目统一返回 200,业务码放在响应体里。这也是常见做法,RESTful 是理想,工程是取舍。
七、一句话总结
RESTful 就是:URL 只放名词,方法表达动作,状态码表达结果。
记不住就背这四句:
URL 是名词,不是动词。
集合用复数,单个带 ID。
方法定动作,查增改删。
状态码说话,别总 200。
把这四句和 /users 那个例子绑在一起,基本就不会忘。