JavaWeb Http讲解

2 阅读7分钟

二、HTTP 核心概念

  1. 定义:HTTP(HyperText Transfer Protocol,超文本传输协议),是一种用于传输超文本(如 HTML、图片、视频等)的应用层协议,基于 TCP/IP 协议族,用于客户端(浏览器)和服务器之间的通信。

  2. 核心作用:规范了客户端和服务器之间数据传输的格式、请求 / 响应的流程,让不同的客户端和服务器能实现通用的通信。

  3. 版本发展

    1. HTTP/1.0:早期版本,短连接,每次请求都需要建立新的 TCP 连接,请求完成后立即断开,效率较低。
    2. HTTP/1.1:目前主流版本,长连接(持久连接) ,一次 TCP 连接可处理多个请求 / 响应,支持管道化请求,大幅提升通信效率;同时支持断点续传、缓存优化等特性。
    3. HTTP/2:基于二进制帧传输,支持多路复用、头部压缩、服务器推送,性能进一步提升。
    4. HTTP/3:基于 QUIC 协议,替代 TCP,解决队头阻塞问题,提升网络不稳定场景下的传输效率。

三、HTTP 核心特性

  1. 无连接(HTTP/1.0)/长连接(HTTP/1.1+):如上版本发展所述,1.1 后默认开启长连接(Connection: keep-alive)。

  2. 无状态:协议本身不记录客户端的任何状态信息,每次请求都是独立的,服务器无法识别连续的请求是否来自同一客户端。

    1. 问题:无法实现用户登录、购物车等需要保持状态的功能。
    2. 解决方案:通过Cookie、Session 技术补充状态管理(后续课程重点讲解)。
  3. 简单快速:请求格式简单,由请求行、请求头、请求体组成;服务器处理请求后返回的响应格式同样简洁,通信速度快。

  4. 灵活:支持多种数据类型,通过Content-Type头指定传输的数据格式(如 text/html、application/json、image/jpg 等)。

  5. 基于请求 - 响应模型:始终由客户端发起请求,服务器被动接收请求并返回响应,不存在服务器主动向客户端推送数据的情况(HTTP/2 的服务器推送是扩展特性)。

四、HTTP 请求格式(客户端→服务器)

一个完整的 HTTP 请求由请求行、请求头、空行、请求体四部分组成,空行用于分隔请求头和请求体,是协议规定的格式。

1. 请求行

包含请求方法、请求 URL、协议版本,以空格分隔,结尾以回车换行(\r\n)结束。

  • 格式:请求方法 请求URL HTTP/版本

  • 示例:GET /index.html HTTP/1.1

  • 核心请求方法:

    • 方法作用特点
      GET请求获取服务器上的资源明文传输,参数拼接在 URL 后,有长度限制,常用于查询
      POST向服务器提交数据(如表单、文件)数据放在请求体中,密文传输,无长度限制,常用于提交、新增
      HEAD仅请求资源的响应头,不返回响应体用于检查资源是否存在、获取文件大小等
      PUT向服务器上传资源,替换原有资源幂等性操作,常用于更新
      DELETE请求删除服务器上的资源幂等性操作
      OPTIONS查询服务器支持的请求方法用于跨域请求的预检(CORS)
    • 重点掌握:GET、POST(开发中最常用)。

2. 请求头

键值对组成,格式为Key: Value,每行一个,用于传递请求的附加信息(如客户端类型、请求参数、缓存信息等)。

  • 常用请求头:

    • User-Agent:标识客户端的类型(如浏览器、手机 APP、爬虫),示例:Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36
    • Accept:客户端支持的响应数据类型,示例:text/html,application/json
    • Accept-Encoding:客户端支持的压缩方式,示例:gzip, deflate
    • Host:请求的服务器域名和端口,示例:www.baidu.com:80
    • Cookie:客户端存储的服务器下发的状态信息,用于身份识别、状态保持
    • Content-Type:请求体的数据格式(POST 请求必备),示例:application/x-www-form-urlencoded(表单)、multipart/form-data(文件上传)、application/json(JSON 数据)
    • Content-Length:请求体的字节长度

3. 空行

单独的\r\n,表示请求头结束,后续为请求体,不可省略,是 HTTP 协议的格式要求。

4. 请求体

存放需要向服务器提交的数据,仅POST、PUT等方法会使用,GET 方法无请求体。

  • 示例(表单提交):username=kuangshen&password=123456
  • 示例(JSON 提交):{"name":"狂神","age":20}

五、HTTP 响应格式(服务器→客户端)

服务器接收并处理请求后,返回的响应由响应行、响应头、空行、响应体四部分组成,格式与请求对应。

1. 响应行

包含协议版本、状态码、状态描述,以空格分隔,结尾以 \r\n 结束。

  • 格式:HTTP/版本 状态码 状态描述
  • 示例:HTTP/1.1 200 OK

2. 状态码

3 位数字,用于标识服务器处理请求的结果,分为 5 大类,开发中重点掌握常见状态码。

分类数字范围核心含义常见状态码
1xx100-199信息性状态码,服务器已接收请求,继续处理100(继续)、101(协议切换)
2xx200-299成功状态码,请求已成功处理200(OK,请求成功)、201(Created,资源创建成功)
3xx300-399重定向状态码,需要客户端进一步操作301(永久重定向)、302(临时重定向)、304(资源未修改,使用缓存)
4xx400-499客户端错误,请求本身有问题400(请求参数错误)、403(禁止访问)、404(资源不存在)、405(请求方法不支持)
5xx500-599服务器错误,服务器处理请求时出错500(服务器内部错误)、503(服务器不可用)、504(网关超时)

3. 响应头

同样为Key: Value的键值对,传递响应的附加信息(如服务器信息、响应体格式、缓存规则等)。

  • 常用响应头:

    • Server:服务器的软件类型,示例:Tomcat/9.0.60Nginx/1.20.1
    • Content-Type:响应体的数据格式 + 编码,示例:text/html;charset=UTF-8application/json;charset=UTF-8
    • Content-Length:响应体的字节长度
    • Content-Encoding:服务器使用的压缩方式,示例:gzip
    • Set-Cookie:服务器向客户端下发 Cookie,用于状态管理
    • Refresh:定时刷新 / 重定向,示例:3;url=https://www.kuangstudy.com(3 秒后跳转到指定 URL)
    • Cache-Control:缓存控制,示例:max-age=3600(缓存 1 小时)
    • Access-Control-Allow-Origin:跨域资源共享(CORS),指定允许的跨域域名

4. 空行

与请求格式一致,单独的\r\n,分隔响应头和响应体,不可省略。

5. 响应体

服务器返回的实际数据,是客户端最终要渲染 / 处理的内容,如 HTML 页面、JSON 数据、图片二进制流、视频流等。

  • 示例(HTML):<html><head><title>狂神说Java</title></head><body>Hello JavaWeb</body></html>
  • 示例(JSON):{"code":200,"msg":"请求成功","data":{"name":"狂神"}}

六、HTTP 抓包工具使用

开发中需要查看 HTTP 请求 / 响应的实际内容,常用抓包工具:

  1. 浏览器开发者工具(F12):

    1. 打开Network面板,刷新页面即可捕获所有 HTTP 请求。
    2. 点击任意请求,可查看Request Headers(请求头)、Response Headers(响应头)、Request Payload(请求体)、Response(响应体) 等信息,是开发中最常用的轻量工具。
  2. Fiddler/Charles:第三方抓包工具,可捕获所有客户端的网络请求,支持手机端抓包,适合复杂的网络调试。

  3. Postman:不仅可以抓包,还能模拟发送各种 HTTP 请求(GET/POST/PUT 等),是接口开发和测试的必备工具。

七、核心考点与开发注意事项

  1. GET 和 POST 的区别:是面试高频题,从参数传递、安全性、长度限制、请求体、应用场景五个维度记忆。
  2. HTTP 无状态的解决:Cookie(客户端存储,不安全)、Session(服务器存储,安全),后续课程会详细讲解。
  3. 状态码的使用:开发中接口返回的状态码要符合 HTTP 规范,如查询成功返回 200,参数错误返回 400,服务器错误返回 500。
  4. 请求头 / 响应头的应用:如通过User-Agent做客户端适配,通过Content-Type指定数据格式,通过Cookie/Set-Cookie实现状态保持。
  5. 编码问题:请求和响应中要统一编码(如 UTF-8),避免中文乱码,核心是设置Content-Type中的charset属性。