欢迎光临
我们一直在努力

day5-HTTP 协议

HTTP 协议

一、核心概念

HTTP(Hyper Text Transfer Protocol,超文本传输协议)是浏览器与服务器之间数据传输的规则约定。

它定义了请求和响应的格式,是万维网(WWW)的基础协议。

二、核心交互模型

HTTP 基于请求 – 响应模型工作:

  • 请求:浏览器(客户端)主动向服务器发送请求数据
  • 响应:服务器接收请求后,返回响应数据给浏览器
  • 核心特点:一次请求必然对应一次响应,请求与响应一一对应
  • 三、主要特点

  • 基于 TCP 协议

    • HTTP 底层依赖 TCP 协议,因此是面向连接的,传输过程更安全可靠。
    • 建立连接时会经过 TCP 三次握手,确保通信链路稳定。
  • 请求 – 响应模型

    • 严格遵循 “一次请求对应一次响应” 的模式,服务器不会主动向客户端推送数据。
  • 无状态协议

    • 定义:协议本身不具备记忆能力,每次请求 – 响应都是独立的,服务器不会记录之前的请求信息。
    • 缺点:多次请求之间无法直接共享数据(如用户登录状态),需借助 Cookie、Session 等技术补充。
    • 优点:减少了服务器的存储和计算开销,使得协议本身更轻量,处理速度更快。

  • 四、常用请求方法

    请求方法定义了客户端希望服务器执行的操作,常见的有:

    方法描述常用场景
    GET 向服务器请求获取资源 页面查询、搜索(参数拼接在 URL 中)
    POST 向服务器提交数据,用于创建或更新资源 提交表单、上传文件(数据放在请求体中)
    PUT 向服务器提交数据,用于更新资源 全量更新数据(如修改用户信息)
    DELETE 请求服务器删除指定资源 删除数据(如删除订单)
    HEAD 与 GET 类似,但只返回响应头,不返回响应体 检查资源是否存在或获取资源元信息
    OPTIONS 查询服务器支持的请求方法 跨域请求预检(CORS)

    GET vs POST 核心区别

    • GET 参数在 URL 中,长度有限制,安全性低;POST 参数在请求体中,长度无限制,安全性更高。
    • GET 请求可被缓存、收藏;POST 请求不可被缓存、收藏。

    五、HTTP 状态码

    状态码是服务器对请求的处理结果进行的分类标识,分为 5 大类:

    分类范围含义常见示例
    1xx 信息性 100-199 服务器已接收请求,需客户端继续操作 101(切换协议,如升级为 WebSocket)
    2xx 成功 200-299 请求已成功处理 200(OK,请求成功)、201(Created,资源创建成功)
    3xx 重定向 300-399 需客户端进一步操作才能完成请求 301(永久重定向)、302(临时重定向)、304(资源未修改,使用缓存)
    4xx 客户端错误 400-499 客户端请求有误,服务器无法处理 400(Bad Request,请求参数错误)、401(Unauthorized,未授权)、403(Forbidden,禁止访问)、404(Not Found,资源不存在)
    5xx 服务器错误 500-599 服务器处理请求时发生错误 500(Internal Server Error,服务器内部错误)、502(Bad Gateway,网关错误)、503(Service Unavailable,服务不可用)

    六、请求报文与响应报文结构

    HTTP 报文由行、头、体三部分组成:

    1. 请求报文结构

    请求行(请求方法 + URL + HTTP版本)
    请求头(键值对,如 Host、User-Agent、Content-Type)
    空行
    请求体(POST/PUT 请求时携带的数据)

    示例

    POST /login HTTP/1.1
    Host: www.example.com
    Content-Type: application/json
    Content-Length: 30

    {"username":"admin","password":"123456"}

    案例

    GET /request?name=ys HTTP/1.1
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
    Accept-Encoding: gzip, deflate, br, zstd
    Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
    Cache-Control: max-age=0
    Connection: keep-alive
    Host: localhost:8080
    Sec-Fetch-Dest: document
    Sec-Fetch-Mode: navigate
    Sec-Fetch-Site: none
    Sec-Fetch-User: ?1
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Mobile Safari/537.36 Edg/144.0.0.0
    sec-ch-ua: "Not(A:Brand";v="8", "Chromium";v="144", "Microsoft Edge";v="144"
    sec-ch-ua-mobile: ?1
    sec-ch-ua-platform: "Android"

    1. 请求行(Request Line)

    GET /request?name=ys HTTP/1.1

    • GET:请求方法,表示获取资源
    • /hello?name=ys:请求路径及查询参数
    • HTTP/1.1:使用的 HTTP 协议版本

    2. 请求头(Request Headers)

    这部分是一系列键值对,用来描述请求的附加信息,比如客户端能力、目标主机等。

    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
    Accept-Encoding: gzip, deflate, br, zstd
    Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
    Cache-Control: max-age=0
    Connection: keep-alive
    Host: localhost:8080
    Sec-Fetch-Dest: document
    Sec-Fetch-Mode: navigate
    Sec-Fetch-Site: none
    Sec-Fetch-User: ?1
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Mobile Safari/537.36 Edg/144.0.0.0
    sec-ch-ua: "Not(A:Brand";v="8", "Chromium";v="144", "Microsoft Edge";v="144"
    sec-ch-ua-mobile: ?1
    sec-ch-ua-platform: "Android"


    3. 空行

    请求头结束后,会有一个单独的空行(CRLF),用来分隔请求头和请求体。


    4. 请求体(Request Body)

    在这个 GET 请求中,请求体是空的。

    因为 GET 请求的参数通常会放在 URL 的查询字符串里(如 ?name=ys),所以不需要在请求体中携带数据。只有 POST、PUT 等请求才会在请求体中发送数据。

    2. 响应报文结构

    响应行(HTTP版本 + 状态码 + 状态描述)
    响应头(键值对,如 Content-Type、Set-Cookie、Cache-Control)
    空行
    响应体(返回给客户端的资源内容,如 HTML、JSON)

    示例

    HTTP/1.1 200 OK
    Content-Type: application/json
    Content-Length: 25

    {"code":200,"msg":"登录成功"}


    HTTP/1.1 200
    Content-Type: text/html;charset=UTF-8
    Content-Length: 2
    Date: Sun, 25 Jan 2026 14:40:41 GMT
    Keep-Alive: timeout=60
    Connection: keep-alive
    //空行
    //无数据

    七、常见请求头与响应头

    • 常用请求头

      请求头字段含义与说明
      Host 请求的目标服务器域名和端口,即请求的主机名。
      User-Agent 客户端浏览器或设备信息,例如 Chrome 浏览器的标识类似 Mozilla/5.0 … Chrome/79。
      Accept 表示浏览器能接收的资源类型,如 text/*、image/* 或者 */* 表示所有类型。
      Accept-Language 表示浏览器偏好的语言,服务器可以据此返回不同语言的网页。
      Accept-Encoding 表示浏览器可以支持的压缩类型,例如 gzip、deflate 等。
      Content-Type 请求体的数据格式(如 application/json、multipart/form-data),即请求主体的数据类型。
      Content-Length 请求主体的大小(单位:字节)。
      Authorization 身份验证信息(如 Bearer Token),用于携带用户的身份凭证。
      Cookie 客户端存储的 Cookie 数据,每次请求会自动携带,用于维持会话状态。

      常用响应头

      响应头字段含义与说明
      HTTP/1.1 200 OK 响应行,包含协议版本、状态码和状态描述。
      Content-Type 响应体的数据格式,如 text/html;charset=UTF-8、application/json。
      Content-Length 响应主体的大小(单位:字节)。
      Date 服务器生成响应的时间。
      Set-Cookie 服务器向客户端设置 Cookie,用于维持会话状态。
      Cache-Control 控制浏览器缓存策略,如 no-cache、max-age=3600。
      Access-Control-Allow-Origin 跨域资源共享(CORS)允许的源,如 * 表示允许所有域名。
      Location 重定向目标 URL,配合 3xx 状态码使用。
      Keep-Alive 控制持久连接的超时时间,如 timeout=60。
      Connection 表示连接状态,如 keep-alive 表示保持连接。

    • HTTP 状态码分类对照表

      状态码范围含义说明
      1xx 响应中 – 临时状态码,表示请求已经接收,告诉客户端应该继续请求或者如果它已经完成则忽略它。
      2xx 成功 – 表示请求已经被成功接收,处理已完成。
      3xx 重定向 – 重定向到其他地方;让客户端再发起一次请求以完成整个处理。
      4xx 客户端错误 – 处理发生错误,责任在客户端。如:请求了不存在的资源、客户端未被授权、禁止访问等。
      5xx 服务器错误 – 处理发生错误,责任在服务端。如:程序抛出异常等。

    3.x重定向
    301 Moved Permanently

    (永久重定向)

    当客户端访问一个 URL 时,服务端返回 301 状态码,意味着:

    • 这个请求的资源已经被永久移动到了新的 URL
    • 浏览器会自动跳转到响应头 Location 字段指定的新地址
    • 浏览器会缓存这个重定向关系,下次再访问旧地址时,会直接请求新地址,不再经过服务端跳转

    1.发出请求

    http://www.bilibili.com/

    正确的应该是https协议

    可以看到有两次请求

    在这里插入图片描述

    第一次请求得到的状态码是3开头,返回一个Location: https://www.bilibili.com/

    在这里插入图片描述

    浏览器根据返回的Location进行第二次请求

    4.x客户端错误
    404资源不存在

    请求一个本地不存在的 localhost:8080/request2

    在这里插入图片描述

    5.x服务器错误
    500 Internal Server Error

    在后端设置一个错误

    @RequestMapping(value = "/request")
    public String request(HttpServletRequest request) {

    // 获取请求方式
    String method = request.getMethod();

    int a=1/0;//springBoot捕捉到的异常,返回500错误

    …

    return "Ok";
    }

    在这里插入图片描述

    八、无状态问题的解决方案

    为了解决 HTTP 无状态导致的 “多次请求无法共享数据” 问题,常用以下技术:

  • Cookie:存储在客户端的小型文本文件,每次请求自动携带到服务器。
  • Session:存储在服务器端的用户会话信息,通过 Cookie 传递 Session ID 关联客户端。
  • Token:客户端请求登录后,服务器返回一个 Token,后续请求携带 Token 完成身份验证(如 JWT)。

  • 九、HTTP 协议的发展

    • HTTP/1.1:目前应用最广泛的版本,支持持久连接、管线化请求(理论支持但实际几乎未落地)。
    • HTTP/2:引入多路复用、二进制分帧、服务器推送等特性,大幅提升性能。
    • HTTP/3:基于 QUIC 协议,使用 UDP 传输,解决了 TCP 队头阻塞问题,进一步提升速度和稳定性。

    HTTP 请求 – 响应完整流程(Java 后端版)

    全程仅服务端做对象封装,客户端仅收发 / 解析 HTTP 纯文本,Web 容器(Tomcat)负责格式转换,核心流程共 6 步:

  • 客户端发请求:浏览器组装HTTP 纯文本请求(含请求行、请求头、请求体),发送至服务端 Tomcat;
  • 服务端封装请求对象:Tomcat 接收请求文本,自动封装为HttpServletRequest 对象(Java 专属),传递给后端程序(Servlet/Controller);
  • 后端处理业务(后端重点):程序员调用该对象的专属方法(getMethod ()/getParameter () 等),获取请求方式、URL、参数等信息,执行业务逻辑;
  • 服务端封装响应对象:后端程序创建HttpServletResponse 对象,通过其方法(setHeader ()/getWriter ().write () 等),设置响应状态码、响应头、响应体(JSON/HTML 等);
  • 容器转换响应格式:Tomcat 将配置好的 HttpServletResponse 对象,自动转换回 HTTP 纯文本响应;
  • 客户端接收解析:浏览器接收纯文本响应,自行解析其中的状态码、响应头、响应体,完成页面渲染 / 数据处理。
  • 核心关键记忆

    • HttpServletRequest/HttpServletResponse:仅服务端生效的 Java 工具对象,目的是让程序员便捷操作请求 / 响应,不会传递给客户端;
    • 前后端传输的唯一格式:HTTP 纯文本(请求文本 / 响应文本),客户端无对应 Java 对象,也无需封装。
    赞(0)
    未经允许不得转载:171主机测评 » day5-HTTP 协议
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址