故事场景:与图书馆管理员的两种互动
你(浏览器/客户端)是一位学者,需要与一座巨大的“Web世界大图书馆”(服务器)进行互动。
方式一:GET
— 寄一张“图书查询明信片”
这是一种公开、简单、用于索取信息的方式。
-
• 流程:
-
1. 你想要查询一些书籍。你拿出了一张标准的“查询明信片”(
GET
请求)。 -
2. 你在明信片的公开页面上写下了你所有的要求:“你好,请帮我找一下主题是‘Java’的,在第1页的书籍。”(对应URL
/search?query=Java&page=1
)。 -
3. 你把这张写得明明白白的明信片递给了图书管理员。
-
-
• 特点:
-
• 公开透明:邮递路上的任何人都能看到你查询了什么。不适合传递敏感信息(比如你的借书证密码)。
-
• 长度有限:明信片的空间有限,你写不了太长的查询条件(URL有长度限制)。
-
• 可收藏/可分享 (Bookmarks/History):这张明信片你可以自己收藏一张(加入书签),也可以轻松地把它复印给朋友(分享URL),朋友用同样的明信片能得到同样的结果。
-
• 无副作用 (Safe & Idempotent):你查询一本书,无论查一次还是一百次,图书馆的书架不会有任何变化。这个操作是安全的、幂等的。
-
• 可被缓存 (Cacheable):如果图书管理员发现很多人都在查询同一本书,他可能会把这本书的查询结果复印几份放在前台(缓存),下次再有人用同样的明信片来问,他可以直接给复印件,速度更快。
-
方式二:POST
— 投递一个“稿件申请包裹”
这是一种私密、强大、用于提交信息的方式。
-
• 流程:
-
1. 你写好了一篇学术论文,准备提交给图书馆发表(创建新资源)。
-
2. 你把厚厚的论文稿件(数据)装进一个不透明的、密封严实的大包裹(
POST
请求体)里。 -
3. 在包裹的封面上,你只写了收件部门:“稿件提交处”(对应URL
/submit-paper
),而没有写任何关于论文的细节。 -
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地址栏中看不到这些具体数据,就像包裹里的物品被封存起来了。