HTTP 请求与响应处理
一、这一章在讲什么
本章主要讲解了在 Java Web 开发中,程序员如何与 HTTP 协议打交道。核心在于理解 "封装" 的思想:Web 服务器(Tomcat)负责把复杂的协议文本转换成简单的 Java 对象(Request/Response),让我们能以面向对象的方式,轻松读取浏览器传来的数据并返回处理结果。
二、核心概念
1. HttpServletRequest (请求对象)
- 它是什么:HTTP 请求协议在 Java 中的"代言人"。
- 作用:用来获取浏览器传来的所有信息(如参数、头信息)。
- 原理:Tomcat 接收到 HTTP 原始报文后,按照协议规则解析字符串,并实例化该对象。
- 易混淆点 :它不是由程序员
new出来的,而是 Tomcat 传给我们的。
2. HttpServletResponse (响应对象)
- 它是什么:HTTP 响应协议的"模具"。
- 作用:程序员通过操作它,决定给浏览器返回什么内容、什么状态码。
- 原理:程序员往这个对象里填数据,方法执行完后,Tomcat 把它翻译回 HTTP 报文发给浏览器。
3. 状态码 (Status Code)
- 分类 :
- 2xx (成功):一切正常。
- 4xx (客户端错误):你找的地方不对(404)或你没权限(401)。
- 5xx (服务端错误):后端代码写崩了(空指针等)。
三、重难点
1. 自动封装与解析
- 结论 :程序员永远不需要手写代码去拆分 HTTP 字符串。
- 原因:解析协议是 Web 服务器(Tomcat)的本职工作。
- 比喻 :HTTP 协议就像一份英文快递报关单 ,Tomcat 是翻译兼快递员,它把英文报关单翻译成你认得的中文清单(Request 对象)送到你手上。
2. ResponseEntity vs HttpServletResponse
- 结论 :
ResponseEntity是 Spring 提供的进阶版,推荐使用。 - 原因 :它支持链式编程(
.status().header().body()),代码更简洁,逻辑更聚合。
四、代码理解
java
@RequestMapping("/demo")
public ResponseEntity<String> handle(HttpServletRequest request) {
// 1. 获取请求数据
String name = request.getParameter("name");
// 2. 构造响应并返回
return ResponseEntity.status(200) // 设置状态码
.header("my-header", "ok") // 设置自定义响应头
.body("Hello, " + name); // 设置响应体
}
- 关键行 1 :
HttpServletRequest作为参数,Spring 会自动把 Tomcat 封装好的对象传进来。 - 关键行 3 :
getParameter是最常用的方法,用于拿 URL 里的参数。 - 关键行 6-8:链式调用,一气呵成完成响应配置。
五、易错点
- 4xx 和 5xx 分不清:页面报 404 应该去检查前端路径或 Controller 映射;报 500 必须去看后端控制台日志。
- 试图手动 new 对象 :记住
HttpServletRequest是服务器给你的,自己new的对象里没数据。 - 响应状态码滥用:正常返回数据却手动设个 404,会导致前端框架(如 Axios)拦截报错。
六、记忆口诀 / 通俗比喻
请求是"读信" :信封信纸都被 Tomcat 拆好了,你只管读(Request)。 响应是"写信" :你写好内容填好地址,Tomcat 帮你贴邮票寄出去(Response)。 4 开头是客错 :顾客(客户端)走错门了。 5 开头是店错:店里(服务器)厨师滑倒了。
七、应用
在实际开发中,比如做一个登录功能:
- 通过
request.getParameter("password")拿到用户输入的密码。 - 如果密码错误,程序员需要手动调用
response.setStatus(401)(或者使用ResponseEntity),告诉浏览器"你没权限访问",此时浏览器通常会弹出登录框或跳转报错页。
八、最终总结
本章搞定了 Web 开发的"输入"与"输出"。Tomcat 负责脏活累活(解析和拼装协议报文),我们程序员只需要通过 HttpServletRequest 拿数据 ,通过 ResponseEntity 或 HttpServletResponse 给结果。重点关注常用状态码,这是前后端沟通的"黑话"。