HTTP 协议是后端开发中与前端(浏览器)打交道的“语言”。无论是使用原生的 Servlet 还是现在的 Spring Boot,底层的通信逻辑都离不开它。
🌐 JavaWeb 核心:HTTP 协议
1. 什么是 HTTP?
HTTP (Hyper Text Transfer Protocol),即超文本传输协议。
它规定了浏览器(客户端)和服务器之间数据传输的规则。在 JavaWeb 开发中,我们编写的服务端程序本质上就是在接收 HTTP 请求并返回 HTTP 响应。
核心特点:
- 基于 TCP 协议:面向连接,数据传输安全可靠。
- 请求-响应模型:一次请求对应一次响应(由客户端主动发起)。
- 无状态:协议本身对事务处理没有记忆能力,每次请求-响应都是独立的。
- 优点:速度快。
- 缺点:多次请求间不能直接共享数据(后续你会通过Session/Cookie/Token来解决这个问题)。
2. HTTP 请求数据格式 (Request)
请求数据主要由三部分组成:
- 请求行:包含请求方式(GET/POST)、资源路径、协议版本(如 HTTP/1.1)。
- 请求头:以 key: value 格式出现的辅助信息。
- Host: 请求的主机名。
- User-Agent: 浏览器标识(服务器通过它判断客户端类型)。
- Accept: 浏览器能接收的资源类型(如 text/html, application/json)。
- Content-Type:(重要)请求体的数据类型。 3.请求体:存放 POST 请求的参数数据。
🥊 GET vs POST 的区别
| 特性 | GET | POST |
|---|---|---|
| 参数位置 | 拼接在 URL 后面(请求行中) | 放在请求体中 |
| 数据大小 | 有限制(受 URL 长度限制) | 理论上无限制 |
| 安全性 | 较低(参数直接暴露在地址栏) | 相对较高 |
3. HTTP 响应数据格式 (Response)
响应数据同样分为三部分:
- 响应行:协议版本、状态码、状态码描述(如 HTTP/1.1 200 OK)。
- 响应头:服务器返回给浏览器的附加信息。
- Content-Type: 告诉浏览器返回的数据是什么格式(如 image/png 或 text/html)。
- Set-Cookie: 服务器向浏览器设置 Cookie。
- 响应体:服务器返回的真实数据(HTML 页面、图片、或JSON 数据)。
4. 重点:响应状态码 (Status Code)
状态码是服务器告诉浏览器“这次请求结果如何”的代号,主要分为五类:
| 类别 | 含义 | 常见代表 |
|1xx| 临时状态 | 正在处理中 |
|2xx|成功|200 (OK): 完美解决 |
|3xx|重定向|302 (Found): 临时跳转;304 (Not Modified): 命中缓存 |
|4xx|客户端错误|400 (Bad Request): 请求参数有误;404 (Not Found): 找不到资源 |
|5xx|服务端错误|500 (Internal Error): 后端 Java 代码抛异常了 |
| 状态码 | 英文描述 | 解释 |
|---|---|---|
| 200 | OK | 客户端请求成功,即处理成功,这是我们最想看到的状态码 |
| 302 | Found | 指示所请求的资源已移动到由 Location 响应头给定的 URL,浏览器会自动重新访问到这个页面 |
| 304 | Not Modified | 告诉客户端,你请求的资源至上次取得后,服务端并未更改,你直接用你本地缓存吧。隐式重定向 |
| 400 | Bad Request | 客户端请求有语法错误,不能被服务器所理解 |
| 403 | Forbidden | 服务器收到请求,但是拒绝提供服务,比如:没有权限访问相关资源 |
| 404 | Not Found | 请求资源不存在,一般是 URL 输入有误,或者网站资源被删除了 |
| 405 | Method Not Allowed | 请求方式有误,比如应该用 GET 请求方式的资源,用了 POST |
| 428 | Precondition Required | 服务器要求有条件的请求,告诉客户端要想访问该资源,必须携带特定的请求头 |
| 429 | Too Many Requests | 指示用户在给定时间内发送了太多请求(“限速”),配合 Retry-After (多长时间后可以请求) 响应头一起使用 |
| 431 | Request Header Fields Too Large | 请求头太大,服务器不愿意处理请求,因为它的头部字段太大。请求可以在减少请求头域的大小后重新提交。 |
| 500 | Internal Server Error | 服务器发生不可预期的错误。服务器出异常了,赶紧看日志去吧 |
| 503 | Service Unavailable | 服务器尚未准备好处理请求,服务器刚刚启动,还未初始化好 |
💡 学习建议
- 学会使用开发者工具:在 Chrome 浏览器按 F12 -> Network 选项卡,你可以实时看到每一个 Spring Boot 接口发出的请求头和响应体。
- 关注 Content-Type:在后续学习 Spring Boot 异步请求(Axios/AJAX)时,你会频繁处理 application/json 格式,它是目前前后端交互的主流。
- 状态码即口法:看到 404 找前端路径或资源名,看到 500 赶紧回 IDEA 看控制台日志。