承接上篇 SpringBoot 快速入门,本篇完整讲解 HTTP 协议全套知识,包含协议特点、请求完整结构、请求对象获取参数、响应完整结构、两种响应封装方式,配套完整代码示例,是前后端数据交互核心理论,下篇讲解综合案例与三层架构 IOC/DI 解耦。

一、HTTP 协议基础概念

1. 协议全称

Hyper Text Transfer Protocol 超文本传输协议,专门规定浏览器与服务器之间数据传输的统一规则,所有网页访问都遵循该协议。

2. 三大核心特点

  1. 基于 TCP 连接,传输数据安全可靠;
  2. 一问一答模型:一次浏览器请求,对应服务器一次响应;
  3. 无状态协议:服务器不会记录客户端历史请求信息。
  • 优点:传输速度快;
  • 缺点:多次请求之间无法共享数据(后续 Cookie/Session 解决)。

3. 完整交互流程

浏览器发起 HTTP 请求 → Tomcat 服务器接收解析 → SpringMVC 处理业务 → 组装 HTTP 响应返回浏览器。

二、HTTP 请求详解(浏览器→服务端)

2.1 请求完整三部分

一条标准 HTTP 请求分为三块,自上而下依次为:请求行、请求头、请求体,请求头与请求体之间空一行分隔。

  1. 请求行(第一行)格式:请求方式 资源路径 HTTP/版本示例:GET /brand/findAll?name=OPPO HTTP/1.1
  2. 请求头:多行 key:value 键值对,描述浏览器环境、支持的数据格式;
  3. 请求体:仅 POST 请求存在,存放提交参数,GET 无请求体。

2.2 常用请求头对照表

请求头 作用说明
Host 当前访问服务器主机与端口
User-Agent 浏览器型号、系统标识,用于区分设备
Accept 浏览器可接收的数据格式(html/json 等)
Accept-Language 浏览器偏好语言(中文 / 英文)
Accept-Encoding 支持的压缩格式(gzip)
Content-Type 请求体数据类型(POST 专用)
Content-Length 请求体字节长度(POST 专用)

2.3 GET 与 POST 请求核心区别

  1. GET
  • 参数拼接在请求行 URL 后面,格式?key=value&xxx=xxx
  • 无请求体;
  • 浏览器对 URL 长度有限制,适合查询类请求。
  1. POST
  • 参数存放在请求体中;
  • 无长度限制,适合提交表单、上传、新增数据;
  • 常用于密码、批量数据提交。

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 响应完整三部分

响应数据三层结构:响应行、响应头、响应体

  1. 响应行(第一行):协议 + 状态码 + 描述示例:HTTP/1.1 200 OK
  2. 响应头:多行键值对,告诉浏览器页面编码、缓存、Cookie 等;
  3. 响应体:最终返回给浏览器的页面 / JSON 数据。

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 是浏览器与服务器数据传输规范,基于 TCP、一次请求一次响应、无状态;2 请求分为请求行、请求头、请求体;GET 参数在 URL,POST 参数在请求体;3 使用 HttpServletRequest 可一键获取所有请求参数、路径、请求头;4 响应分为响应行、响应头、响应体,状态码区分请求结果;5 两种响应封装:原生 HttpServletResponse、简洁 ResponseEntity;

中篇拓展练习

  1. 写接口分别测试 GET、POST 传参,使用 request.getParameter 获取;
  2. 分别用两种响应方式返回自定义文本,观察浏览器网络面板 HTTP 原始报文;
  3. 打印 User-Agent 请求头,区分电脑 / 手机浏览器标识。

中篇面试高频考点

1 HTTP 协议三大特点;2 GET 和 POST 请求区别;3 200/404/500 状态码含义;4 HttpServletRequest 作用;5 HttpServletResponse 与 ResponseEntity 两种响应写法区别。

下篇预告:用户列表 Web 综合实战、三层架构分层思想、耦合与解耦、IOC 控制反转、DI 依赖注入、四大 Bean 注解、三种注入方式。

当前文件内容过长,豆包只阅读了前 52%。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐