HTTP 协议层
方法、状态码、头与 CORS。
HTTP 协议层
这一课你将能做到
- 熟练运用 GET/POST/PUT/DELETE/PATCH,并说清楚各自的语义和幂等性
- 根据业务场景选择正确的 HTTP 状态码,不再只会 200/500
- 配置 CORS 解决跨域问题,理解预检请求(Preflight)机制
为什么要学
HTTP 是 API 的载体。你设计的 URI 再漂亮,如果 HTTP 方法用错、状态码乱返、Header 不会配,调用方照样崩溃。面试必考:POST 和 PUT 区别?301 和 302 区别?CORS 怎么配?
先建立图像
HTTP 请求报文:
┌─────────────────────────────────────────┐
│ POST /api/lessons HTTP/1.1 │ ← 请求行:方法 + URI + 协议版本
│ Host: localhost:8080 │ ← 请求头
│ Content-Type: application/json │
│ Authorization: Bearer xxx │
│ │
│ {"title":"Spring Boot"} │ ← 请求体
└─────────────────────────────────────────┘
HTTP 响应报文:
┌─────────────────────────────────────────┐
│ HTTP/1.1 201 Created │ ← 状态行:协议版本 + 状态码 + 原因短语
│ Content-Type: application/json │ ← 响应头
│ Location: /api/lessons/123 │
│ │
│ {"id":123,"title":"Spring Boot"} │ ← 响应体
└─────────────────────────────────────────┘
跟着做
步骤 1:GET 查询——安全且幂等
# 查询课程列表
curl -s http://localhost:8080/api/lessons
# 查询单个课程
curl -s http://localhost:8080/api/lessons/1
# 带查询参数
curl -s "http://localhost:8080/api/lessons?trackId=java-web&page=0&size=10"
GET 的语义是「读取」,不应该有副作用。浏览器会缓存 GET 请求,刷新页面会重新发。
步骤 2:POST 创建——非幂等
curl -X POST http://localhost:8080/api/lessons \
-H "Content-Type: application/json" \
-d '{"title":"Spring Security","slug":"spring-security","trackId":"java-web"}'
POST 创建资源,服务器生成 id。多次执行会创建多条记录(除非服务端做去重)。
步骤 3:PUT 全量更新 vs PATCH 部分更新
# PUT:全量替换,必须传完整对象
curl -X PUT http://localhost:8080/api/lessons/1 \
-H "Content-Type: application/json" \
-d '{"title":"Spring Boot 进阶","slug":"spring-boot-advanced","trackId":"java-web","content":"..."}'
# PATCH:只改要变的字段
curl -X PATCH http://localhost:8080/api/lessons/1 \
-H "Content-Type: application/json" \
-d '{"title":"Spring Boot 进阶(第2版)"}'
PUT 是幂等的(多次替换结果一样),PATCH 取决于实现(如果 patch 是「追加」操作,多次执行会追加多次)。
步骤 4:DELETE 删除
curl -X DELETE http://localhost:8080/api/lessons/1
DELETE 是幂等的:删一次和删十次,最终结果都是「资源不存在」。但注意:第二次删除应该返回 404 还是 204?建议返回 204(幂等成功)或 404(明确告知已不存在),不要抛 500。