webapi开发接口设计要不要区分"查询接口"和"动作接口"
在日常开发中,你可能遇到过这样的困惑:
为什么有的接口用 GET 请求,有的用 POST?
查询数据用 GET 没问题,那 新增、修改、删除 要用什么方法?
PUT、PATCH、DELETE 这些 HTTP 方法到底有什么区别?
为什么要搞这么复杂,直接用 POST 不行吗?
今天我们就来深入聊聊这个话题—— 接口设计,到底要不要区分"查询接口"和"动作接口"?
PART 01
PART 02
PART 03
GET /api/users # 获取用户列表
POST /api/users # 创建新用户
GET /api/users/123 # 获取指定用户
PUT /api/users/123 # 更新指定用户(完整更新)
DELETE /api/users/123 # 删除指定用户
# 第一次请求
GET /api/products?category=books
→ 返回 200 OK + 数据 + Cache-Control: max-age=3600
# 缓存有效期内再次请求
GET /api/products?category=books
→ 直接从缓存返回,不需要到达服务器
GET | ||
POST | ||
PUT | ||
DELETE | ||
PATCH |
PART 04
# 查询用户 - 用 POST
POST/api/getUser
POST/api/queryUserList
# 创建用户 - 用 POST
POST/api/createUser
# 更新用户 - 用 POST
POST/api/updateUser
# 删除用户 - 用 POST
POST/api/deleteUser
PART 05
// 查询接口 - GET
@GetMapping("/api/users")
public List<User> getUsers() { ... }
@GetMapping("/api/users/{id}")
public User getUser(@PathVariable Long id) { ... }
// 动作接口 - POST
@PostMapping("/api/users")
public User createUser(@RequestBody User user) { ... }
// 但如果动作需要幂等性,用 PUT 更合适
@PutMapping("/api/users/{id}")
public User updateUser(@PathVariable Long id, @RequestBody User user) { ... }
@DeleteMapping("/api/users/{id}")
public void deleteUser(@PathVariable Long id) { ... }
# GET 查询 - URL 长度有限制
GET/api/users?age=20&city=beijing&status=active&sort=name&order=asc
# POST 查询 - 请求体可以传递复杂结构
POST/api/users/search
{
"filters":[
{"field":"age","operator":">=","value":20},
{"field":"city","equals":"beijing"},
{"field":"status","equals":"active"}
],
"sort":{"field":"name","order":"asc"},
"page":1,
"size":20
}
@PostMapping("/api/users/search")
public List<User> searchUsers(@RequestBody UserQuery query) { ... }
// 批量删除 - 用 DELETE,幂等
@DeleteMapping("/api/users/batch")
public void deleteUsers(@RequestBody List<Long> ids) { ... }
// 批量更新 - 用 PUT,幂等
@PutMapping("/api/users/batch")
public List<User> updateUsers(@RequestBody List<User> users) { ... }
# 用动词(传统方式)
POST /api/createOrder
POST /api/deleteUser
# 用名词 + HTTP 方法(RESTful)
POST /api/orders # 创建订单
DELETE /api/users/123 # 删除用户
# 发送验证码 - 很难找到合适的名词
POST /api/sendSmsCode
# 发起支付 - 也是动作
POST /api/initiatePayment
# 这种情况用动词是可以接受的
# URL 版本控制
GET /api/v1/users
GET /api/v2/users
# Header 版本控制
GET /api/users
Accept: application/vnd.myapp.v2+json
PART 06
PART 07
阅读原文:原文链接