Get请求和Post请求的区别

本文详细比较了GET和POST请求在HTTP中的规范应用,强调了安全原则在设计中的重要性。GET用于安全请求,而POST用于提交数据。随着规范的发展,GET请求可以携带数据,但出于一致性,RESTful设计提倡明确区分查询和修改操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、在规范上来说:

1.get请求一般是用于获取数据;post请求是用于提交数据

2.get请求的请求参数是放在url上的,长度有限制,一般限制在 2~8K 之间,更加常见的是 1k 以内;post请求数据是放在请求体中的,没有的长度限制

3.get请求刷新服务器或者回退没有影响,post请求回退时会重新提交数据请求。

4.get请求会被保存在浏览器历史记录当中,post不会。get请求可以被收藏为书签,因为参数就是url中,但post不能。它的参数不在url中。

5.get请求只能进行url编码(appliacation-x-www-form-urlencoded),post请求支持多种(multipart/form-data等)。

6.get请求和post请求都是http请求方式,底层为TCP协议,通常get请求产生一个TCP包(http header和data一起发送),post请求产生两个TCP包(先发送http header服务器响应100,在发送data服务器响应200)

二、不符合规范时

Get请求和Post请求之间的界限变得越来越模糊,get请求也可以使用body携带数据,post请求也可以在url上拼接请求参数,新版postman实测没有问题,但是老版postman中get请求是不可以有body的,2014 年以前的规范中要求 GET 请求如果有 body,则 body 必须被忽略(虽然不一定报错,但 body 会被忽略);现在没有这个限制了。现在不在 GET 中使用 body 的主要还是因为 GET body 是未定义行为,很有可能不被支持。

那么GET和POST的区别和应用是什么?简而言之,就是“安全”和“不安全”的区别。什么是安全?不用承担责任。什么是不安全?可能需要承担责任。举个例子,点击某个链接以同意某个协议,这个请求明显就是不安全的,因为需要承担责任。如果采用GET,就违反了GET应该用于安全请求的规范。因为浏览器可能在你不知情的情况下预加载这个页面(因为是“安全”的GET请求),这样相当于你在不知情的情况下同意了某个协议,这显然是我们不希望看到的。在契约式的设计里,违反契约的行为是会带来严重的后果的。浏览器按照契约预加载了安全的GET请求,但这本身是不安全的,带来的后果自然要由打破契约的人承担(将这个请求设计成GET的人出来挨打)。

之所以强调“安全”,而不是按照常规的说法强调副作用,因为有副作用的请求不代表不安全;举例来说,服务器有一个显示访问人数的功能,这个功能就可以用GET来做。虽然每次访问都会发送改变服务器状态(计数器)的请求,但用户不会因为这个请求承担责任,这个请求是安全的。至于什么GET请求的URL有长度限制(后来事实证明其实没有),什么GET请求的URL里不能有中文(或者说非ASCII吧),都只是实现上的区别;从最初的设计上来说区别并不在这里。

当然,这些都是纯粹的理论层面的东西。如果遵守RESTful的规范,采用语义化的GET/POST请求,自然也就不会有这些问题了。因为通常来说,查询是安全的;这也是GET的主要作用。


参考自链接:关于在GET请求中使用body_get body_元无心的博客-CSDN博客 get请求和post请求的区别(全面讲解)_get与post是推和取__处女座程序员的日常的博客-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值