HTTP 协议的基本格式

HTTP 协议的基本格式

HTTP(超文本传输协议)是基于请求 - 响应模型的应用层协议,所有通信都由客户端发起请求、服务器返回响应完成。HTTP 请求和响应报文结构高度相似,均由四部分组成:起始行、请求 / 响应头、空行、报文主体。

1. HTTP 请求报文格式

一个完整的 HTTP 请求由以下四部分构成:

表格

组成部分 说明 示例
请求行 格式:请求方法 资源路径 HTTP版本 GET /index.html HTTP/1.1
请求头 键值对形式,传递客户端元数据 Host: www.example.comUser-Agent: Mozilla/5.0
空行 分隔请求头与请求体,必须存在 (CRLF,即回车换行)
请求体 可选,POST/PUT 等方法传递的参数数据 username=admin&password=123

常见请求方法:

❌ 误区:"POST 绝对安全"✅ 真相:POST 的参数只是不在地址栏显示,但默认还是明文传输的,想要真正安全,必须搭配 HTTPS。


四、一句话总结


三、常见误区澄清

❌ 误区:"GET 比 POST 快"✅ 真相:两者本质都是 TCP 请求,GET 只是因为参数在 URL、数据量小,所以看起来更快,性能差异可以忽略不计。

  • GET:获取资源,参数拼接在 URL 中

  • POST:提交数据,参数放在请求体中

  • PUT:更新资源

  • DELETE:删除资源

    2. HTTP 响应报文格式

    服务器返回的响应报文同样由四部分构成:

    表格

    组成部分 说明 示例
    状态行 格式:HTTP版本 状态码 状态描述 HTTP/1.1 200 OK
    响应头 键值对形式,传递服务器元数据 Content-Type: text/htmlSet-Cookie: sessionid=xxx
    空行 分隔响应头与响应体,必须存在 (CRLF)
    响应体 服务器返回的实际数据 HTML 页面、JSON 数据、图片等

    常见状态码:

  • 200:请求成功

  • 301/302:资源重定向

  • 404:资源不存在

  • 500:服务器内部错误


GET VS POST

一、核心区别对比表

表格

对比维度 GET POST
用途 主要用于获取 / 查询数据,是幂等操作 主要用于提交 / 修改数据,不是幂等操作
数据传递方式 参数拼接在URL 地址栏 中(?key=value 参数放在 **HTTP 请求体(Body)** 中
数据长度限制 浏览器 / 服务器对 URL 长度有限制(通常 2KB~8KB),不适合传大数据 理论上无长度限制,可传输大量数据(如文件、表单)
安全性 参数明文暴露在地址栏、历史记录中,不适合传敏感信息 参数在请求体中,地址栏看不到,安全性更高(但本身不加密,仍需 HTTPS)
浏览器缓存 可被浏览器缓存,也会保留在历史记录中 默认不会被缓存,也不会保留在历史记录中
书签 / 收藏 可以直接收藏为书签 不能被收藏
编码方式 只能使用 URL 编码 支持多种编码方式(如 application/x-www-form-urlencoded、multipart/form-data、JSON 等)

二、关键细节拆解

  • 幂等性(Idempotency)

    • GET:多次调用同一个 GET 请求,对服务器的结果没有任何改变(比如多次刷新查询列表,数据不会被修改),这就是幂等。
    • POST:多次提交同一个 POST 请求,可能会重复创建数据(比如重复提交订单),不是幂等操作。
  • 数据位置的影响

    • GET 的参数在 URL 里,会被:
      • 浏览器历史记录保存
      • 服务器日志记录
      • 代理服务器记录所以传密码、手机号这类敏感数据时,绝对不能用 GET。
    • POST 的参数在请求体里,这些地方都看不到,更安全。
  • 表单提交的场景差异

    • HTML 表单默认的提交方式是 GET,适合简单的查询表单。
    • 当表单里有文件上传时,必须用 POST,因为 GET 无法携带文件数据。
  • 浏览器的行为差异

    • 刷新页面时,GET 请求会直接重新加载;POST 请求会提示 "确认重新提交表单"。
    • 按浏览器的后退 / 前进按钮,GET 请求可以正常返回;POST 请求可能会丢失数据。
  • 用 GET:查询、获取数据,比如看文章、搜列表、查信息。

  • 用 POST:提交、修改数据,比如登录、注册、发帖子、上传文件。

相关推荐
爱滑雪的码农1 小时前
Java基础十三:Java中的继承、重写(Override)与重载(Overload)详解
java·开发语言
【 】4231 小时前
C++&STL(Standard Template Library,标准模板库)
java·开发语言·c++
茉莉玫瑰花茶1 小时前
LangChain 核心组件 [ 2 ]
java·数据库·langchain
信徒_1 小时前
ID 生成技术选型
java
a8a3022 小时前
Laravel8.x新特性全解析
java·spring boot·后端
XiYang-DING2 小时前
【Java EE】CAS(Compare And Swap)
java·开发语言·java-ee
白露与泡影2 小时前
Spring Boot 完整流程
java·spring boot·后端
空中海2 小时前
第二章:Maven进阶篇 — 依赖管理与构建生命周期
java·maven