BetaSu / fe-hunter

每天一道题,3个月后,你就是面试小能手,答题还能赚钱哦
1.67k stars 116 forks source link

get与post请求的区别是? #47

Closed BetaSu closed 2 years ago

BetaSu commented 2 years ago

要回答的问题

getpost都是常见的HTTP请求方法,请从以下角度回答他们的区别:

  1. 语义的区别
  2. 应用场景的区别
  3. 请求url、请求头、请求体的区别
  4. 其他方面(比如安全、长度限制...)的区别

最佳答案评选标准

按如上所列角度全面、详细的回答

最佳答案

xiaxiangfeng的回答

答题同学须知

围观同学须知

Travelguest commented 2 years ago
Cloudkkk commented 2 years ago

1、get是从服务器中获取数据,post是向服务器提交数据。 2、get请求具有幂等性,post不具有。 3、get的传参在url后面,post传参是在form表单中 4、get相对不安全,参数全部在url中,且可被浏览器记录在历史中。post相对较安全,浏览器不会保留。 5、get传输数据少(浏览器对url设置了长度上限)。 6、get有一个tcp请求,post有两个(100 continue,200 ok)

c0dedance commented 2 years ago

常见回答

  1. 参数传递方式:Get 使用 URL 或 Cookie 传参,而 Post 将数据放在 body 中
  2. 数据传输大小:Get 的 URL 会有长度上的限制,则 Post 的数据则可以非常大
  3. 安全问题:Post 比 Get 安全,因为数据在地址栏上不可见,GET 方式请求的数据会被浏览器缓存起来,因此有安全问题

最本质的区别

基于 http 协议进行请求, 其实 GET 和 POST 无区别,就像高速公路上不同车型的车,同样是运输信息,容量、方式有所区分; 请求时的方式不同, 都可以携带请求体, 也可以在 URL 带参数 区别来自于浏览器对 URL 长度的限制, 请求体大小来源于服务器的限制

语义的区别

GET 是获取, POST 是提交 Get 是用来从服务器上获得数据,而 post 是用来向服务器上传递数据

lkzwc commented 2 years ago
分类 🚀 GET请求 POST请求
语义 用于从服务器获取数据 用于向服务器上传数据
回退 可回退、回退无害 会再次提交
编码 URL编码 多种编码格式
参数 长度有限、只支持ASCII、(广义去讲:浏览器:2k个字节、服务器:64K)、附带在URL中 长度不限制,任意数据格式、放在body体
缓存 主动缓存、幂等 手动设置 、非幂等
书签 可以 不可以
场景 查询 新增、修改
协议 TCP TCP
协议包个数 只有一个 两个(先发送header服务器响应100,然后在发送data)
安全 不安全(参数都在URL上) 相对安全
总结 本质都是 TCP 链接,并无区别。但是由于 HTTP 的规定以及浏览器/服务器的限制,导致它们在应用过程中有所不同

PS: 其实最有争议的问题是http请求包的问题,POST请求在不同的实现中请求包也是不同,只是大多数的实现中会发送两个包,而不是所有的,比如火狐、从标准上对比来讲的话POST发送两个请求包这个并不成立,只是实现的一种方式而已

最后这一点、卡哥可以展开给大家说说,这边我感觉理解的也是一直半解!

xiaxiangfeng commented 2 years ago

语义的区别

应用场景的区别

以下情况使用 GET:

以下情况下使用 POST:

请求 url、请求头、请求体的区别

get:

post:

GET 与 POST 的本质区别有两点

其他

GET POST
后退按钮/刷新 无害 数据会被重新提交
书签 可收藏为书签 不可收藏为书签
缓存 能被缓存 不能缓存
编码类型 application/x-www-form-urlencoded application/x-www-form-urlencoded 或 multipart/form-data。
历史 参数保留在浏览器历史中 参数不会保存在浏览器历史中
对数据长度的限制 URL 的最大长度是 2048 个字符 无限制
对数据类型的限制 只允许 ASCII 字符 没有限制。也允许二进制数据
安全性 安全性较差,因为所发送的数据是 URL 的一部分。 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中
可见性 数据在 URL 中对所有人都是可见的 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中

ps: RFC 中 100 Continue 并不是 POST Method 中的一个步骤,并且也不仅仅只能用于 POST method