GET和POST的7大区别,一次讲清!

图片

故事场景:与图书馆管理员的两种互动

你(浏览器/客户端)是一位学者,需要与一座巨大的“Web世界大图书馆”(服务器)进行互动。

方式一:GET — 寄一张“图书查询明信片”

这是一种公开、简单、用于索取信息的方式。

  • • 流程:

    1. 1. 你想要查询一些书籍。你拿出了一张标准的“查询明信片”(GET 请求)。

    2. 2. 你在明信片的公开页面上写下了你所有的要求:“你好,请帮我找一下主题是‘Java’的,在第1页的书籍。”(对应URL /search?query=Java&page=1)。

    3. 3. 你把这张写得明明白白的明信片递给了图书管理员。

  • • 特点:

    • • 公开透明:邮递路上的任何人都能看到你查询了什么。不适合传递敏感信息(比如你的借书证密码)。

    • • 长度有限:明信片的空间有限,你写不了太长的查询条件(URL有长度限制)。

    • • 可收藏/可分享 (Bookmarks/History):这张明信片你可以自己收藏一张(加入书签),也可以轻松地把它复印给朋友(分享URL),朋友用同样的明信片能得到同样的结果。

    • • 无副作用 (Safe & Idempotent):你查询一本书,无论查一次还是一百次,图书馆的书架不会有任何变化。这个操作是安全的、幂等的。

    • • 可被缓存 (Cacheable):如果图书管理员发现很多人都在查询同一本书,他可能会把这本书的查询结果复印几份放在前台(缓存),下次再有人用同样的明信片来问,他可以直接给复印件,速度更快。

方式二:POST — 投递一个“稿件申请包裹”

这是一种私密、强大、用于提交信息的方式。

  • • 流程:

    1. 1. 你写好了一篇学术论文,准备提交给图书馆发表(创建新资源)。

    2. 2. 你把厚厚的论文稿件(数据)装进一个不透明的、密封严实的大包裹POST 请求体)里。

    3. 3. 在包裹的封面上,你只写了收件部门:“稿件提交处”(对应URL /submit-paper),而没有写任何关于论文的细节。

    4. 4. 你把这个包裹交给了图书管理员。

  • • 特点:

    • • 私密安全:在递送过程中,没人知道你包裹里装的是什么(数据在请求体中,相对安全)。非常适合提交用户名、密码、银行卡信息等。

    • • 容量巨大:包裹可以非常大,你想提交多厚的论文都可以(理论上无数据大小限制)。

    • • 不可收藏/不可分享:你无法收藏“投递一个包裹”这个动作。你收藏的只是“稿件提交处”的地址,但里面的稿件内容是无法被收藏的。

    • • 有副作用 (Not Safe & Not Idempotent):你每投递一次包裹,图书馆的书库里就多了一本书。如果你不小心重复投递了两次,书库里就会出现两本同样的新书。这个操作会改变图书馆的状态,并且不是幂等的。

    • • 不可被缓存:图书管理员绝不会缓存“提交稿件”这个动作,因为每次提交都意味着一次全新的、需要被处理的请求。

故事总结:

特性

GET

 (寄明信片)

POST

 (投递包裹)

核心目的获取

数据 (Read)

提交/修改

数据 (Create/Update)

数据位置URL 地址栏

 (公开)

请求体

 (私密)

安全性不安全

 (不应用与敏感数据)

相对安全

 (适合敏感数据)

数据大小有限制

 (URL长度限制)

无限制

 (理论上)

书签/历史

✅ 可收藏

❌ 不可收藏

缓存

✅ 可缓存

❌ 不可缓存

幂等性

✅  (多次请求,结果不变)

❌  (多次请求,可能产生多份资源)

核心比喻写在明信片上的公开查询装在信封里的私密提交

一句话总结:

  • • GET 是去要东西的,大摇大摆,两手空空(数据在URL上)。

  • • POST 是去送东西的,小心翼翼,抱着个大箱子(数据在请求体里)。

HTTP请求报文

当你的浏览器向服务器请求一个网页或提交一些数据时,它会发送一个HTTP请求。这个请求的起始行就定义了它是 GET 还是 POST

1. GET 请求:数据在地址栏,公开透明

GET 的核心目的是从服务器获取数据。它的所有参数都附加在URL的末尾,形成查询字符串(query string)。

GET /search?query=Java&page=1 HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
...
  • • 关键特征:数据(query=Java&page=1)直接暴露在URL中,就像明信片的地址和内容都写在外面一样。请求体(Request Body)是空的。

2. POST 请求:数据在请求体,私密且强大

POST 的核心目的是向服务器提交数据,以创建或更新资源。它的参数被封装在HTTP请求的“正文”部分。

POST /login HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 27

username=test&password=12345
  • • 关键特征:数据(username=test&password=12345)被放在请求体(Request Body)中,URL地址栏中看不到这些具体数据,就像包裹里的物品被封存起来了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java干货

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值