HTTP 协议的基本格式

HTTP 协议的基本格式

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

1. HTTP 请求报文格式

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

表格

组成部分 说明 示例
请求行 格式:请求方法 资源路径 HTTP版本 GET /index.html HTTP/1.1
请求头 键值对形式,传递客户端元数据 Host: www.example.com、User-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/html、Set-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:提交、修改数据,比如登录、注册、发帖子、上传文件。

相关推荐
Wang's Blog2 小时前
Java 项目实战: 交友项目 - FastDFS:入门案例
java·开发语言·交友
apcipot_rain2 小时前
C++转Java日记(03)
java·开发语言·c++
皮皮林5512 小时前
Java实现微信扫码登录
java
Yyyyyy~5 小时前
【Java】Day4Web基础知识
java·spring boot
灿飞屋6 小时前
Kotlin与Java虚拟机三:控制流
android·java·开发语言·后端·python·kotlin·安卓
NE_STOP7 小时前
Spring AI Alibaba - MCP入门
java
nice_lcj5207 小时前
【从零理解 Spring AI · 07】对话记忆:让模型记住上一句说了什么
java·spring ai·ai应用开发·chatmemory·对话记忆
SL_staff8 小时前
制造业交付崩盘?用跨部门节点协同计划打通销售、生产与质量链路
java·开源·产品
文丑颜不良啊9 小时前
LeetCode2261~2280题目解析
java·leetcode
SL_staff9 小时前
告别规则黑盒:JVS-Rules 在金融风控中的可视化决策编排实践
java·产品·全栈