承接上篇 SpringBoot 快速入门,本篇完整讲解 HTTP 协议全套知识,包含协议特点、请求完整结构、请求对象获取参数、响应完整结构、两种响应封装方式,配套完整代码示例,是前后端数据交互核心理论,下篇讲解综合案例与三层架构 IOC/DI 解耦。
一、HTTP 协议基础概念
1. 协议全称
Hyper Text Transfer Protocol 超文本传输协议,专门规定浏览器与服务器之间数据传输的统一规则,所有网页访问都遵循该协议。
2. 三大核心特点
- 优点:传输速度快;
- 缺点:多次请求之间无法共享数据(后续 Cookie/Session 解决)。
3. 完整交互流程
浏览器发起 HTTP 请求 → Tomcat 服务器接收解析 → SpringMVC 处理业务 → 组装 HTTP 响应返回浏览器。
二、HTTP 请求详解(浏览器→服务端)
2.1 请求完整三部分
一条标准 HTTP 请求分为三块,自上而下依次为:请求行、请求头、请求体,请求头与请求体之间空一行分隔。
2.2 常用请求头对照表
| Host | 当前访问服务器主机与端口 |
| User-Agent | 浏览器型号、系统标识,用于区分设备 |
| Accept | 浏览器可接收的数据格式(html/json 等) |
| Accept-Language | 浏览器偏好语言(中文 / 英文) |
| Accept-Encoding | 支持的压缩格式(gzip) |
| Content-Type | 请求体数据类型(POST 专用) |
| Content-Length | 请求体字节长度(POST 专用) |
2.3 GET 与 POST 请求核心区别
- 参数拼接在请求行 URL 后面,格式?key=value&xxx=xxx;
- 无请求体;
- 浏览器对 URL 长度有限制,适合查询类请求。
- 参数存放在请求体中;
- 无长度限制,适合提交表单、上传、新增数据;
- 常用于密码、批量数据提交。
2.4 HttpServletRequest 获取请求数据
Tomcat 自动解析全部请求信息,封装为HttpServletRequest对象,直接在 Controller 方法入参接收即可,无需手动解析协议文本。
完整代码示例
@RequestMapping("/request")
public String request(HttpServletRequest request){
// 1. 获取URL上请求参数
String name = request.getParameter("name");
// 2. 获取请求URI/完整URL
String uri = request.getRequestURI();
String url = request.getRequestURL().toString();
// 3. 获取指定请求头
String ua = request.getHeader("User-Agent");
// 4. 获取请求方式 GET/POST
String method = request.getMethod();
// 5. 获取地址栏全部查询参数
String query = request.getQueryString();
return "请求数据获取完成";
}
小结
不需要手动解析原始 HTTP 字符串,框架自动封装请求对象,直接调用方法拿所有请求信息。
三、HTTP 响应详解(服务端→浏览器)
3.1 响应完整三部分
响应数据三层结构:响应行、响应头、响应体
3.2 状态码五大分类
| 分类 | 含义 | 常用码说明 || —- | —- || 1xx | 临时响应,请求未完成 | 极少使用 || 2xx | 请求处理成功 | 200 正常访问 || 3xx | 重定向,跳转新地址 | 302 页面跳转 || 4xx | 客户端错误 | 404 资源不存在;401 未授权 || 5xx | 服务器代码异常 | 500 后台报错 |
3.3 常用响应头
| Content-Type | 响应数据类型:text/html/application/json |
| Content-Length | 返回数据字节大小 |
| Cache-Control | 浏览器缓存规则 |
| Set-Cookie | 给浏览器写入 Cookie 数据 |
3.4 两种设置响应的方式
方式一:HttpServletResponse 原生对象
通过该对象手动设置状态码、响应头、页面内容
@RequestMapping("/response1")
public void responseDemo(HttpServletResponse response) throws IOException {
// 设置响应状态码
response.setStatus(401);
// 自定义响应头
response.setHeader("demo-key","test-value");
// 写入响应体(页面内容)
response.getWriter().write("<h1>返回页面文本</h1>");
}
方式二:ResponseEntity 封装返回(推荐)
Spring 提供专用响应实体,链式调用统一设置状态、头、返回体,代码更整洁
@RequestMapping("/response2")
public ResponseEntity<String> respEntity(){
return ResponseEntity.status(401)
.header("demo-key","demo-val")
.body("接口返回文本数据");
}
补充说明
绝大多数业务场景无需手动修改状态码、响应头,Spring 框架会根据执行结果自动填充。
四、中篇全文总结
中篇拓展练习
中篇面试高频考点
1 HTTP 协议三大特点;2 GET 和 POST 请求区别;3 200/404/500 状态码含义;4 HttpServletRequest 作用;5 HttpServletResponse 与 ResponseEntity 两种响应写法区别。
下篇预告:用户列表 Web 综合实战、三层架构分层思想、耦合与解耦、IOC 控制反转、DI 依赖注入、四大 Bean 注解、三种注入方式。
当前文件内容过长,豆包只阅读了前 52%。





