简介
GET 方法
从指定的资源请求获取
数据
查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:
/test/demo_form.asp?name1=value1&name2=value2
.
POST 方法
向指定的资源提交
要被处理的数据
查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2
区别
-
参数传递:GET是通过URL传递,而POST放在Request body(消息主体)中。
-
浏览器回退:GET是无害的,而POST会再次提交请求(数据会被重新提交)。
-
收藏书签:GET产生的URL地址可以被收藏为书签,而POST不可以。
-
主动缓存:GET请求会被浏览器主动缓存,而POST不会,除非手动设置
-
历史记录:GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
-
参数编码:GET 只能进行 URL 编码,POST请求可以使用多种编码方式。
-
参数类型:GET只接受ASCII字符,而POST没有限制。
-
参数长度:GET方法的参数长度限制主要来自于浏览器和服务器对URL长度的限制。,一般在2000个字符左右,超过这个长度,浏览器可能会截断URL。POST方法理论上没有大小限制,实际中服务器通常会对请求体的大小进行限制。
-
安全性:GET没有POST安全,因为参数直接暴露在URL上(所发送的数据是 URL 的一部分),所以不能用来传递密码等敏感信息。POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。
-
幂等性:GET方法是一种安全的和幂等的方法,它只用于获取资源,而不会对服务器上的资源进行修改,因此可以无限次重复请求而不会对服务器产生影响。POST方法则可能用于修改服务器上的资源,因此不是幂等的。 (幂等表示执行相同的操作,结果也是相同的)
-
数据包:GET 请求会把请求报文一次性发出去,而 POST 可能会分为两个 TCP 数据包:浏览器会先将请求头发送给服务器,待服务器响应100 continue后,浏览器再发送请求数据,服务器最终响应200 ok(返回数据)。这样的过程使得POST方法在网络传输上具有一定的特性。
.
关于TCP数据包
GET产生一个TCP数据包;POST可能产生两个TCP数据包。
也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。
-
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
-
对于POST,理论上,浏览器先发送HTTP头部header,服务器响应100 continue后浏览器再发送数据部分data,服务器响应200 ok(返回数据)。这个过程看似涉及两个数据包的发送。然而,在实际的网络传输中,是否分为两个数据包取决于多种因素:
-
首先,一些客户端(如Firefox)可能会优化传输过程,将头部和数据部分合并为一个数据包发送,以减少网络传输的开销。
-
其次,TCP的拥塞控制、滑动窗口大小以及网络状况等因素也可能影响数据包的划分。如果网络状况良好且数据包大小适中,浏览器和服务器可能会选择合并为一个数据包进行发送。
-
因此,不能简单地认为POST请求一定会分为两个TCP数据包。实际的数据包划分情况取决于具体的网络环境和客户端、服务器的实现策略。
-
总的来说,POST请求的数据包划分是一个相对复杂的过程,受到多种因素的影响。在实际应用中,我们应该关注网络传输的效率和稳定性,而不是过分关注是否分为两个数据包。
-
因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效,但不能一味将GET替代POST:
- GET与POST都有自己的语义,不能随便混用。
- 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。
- 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
其他请求方法
-
GET:获取资源
GET请求中的数据通常附加在URL的查询字符串中。 -
POST:向指定资源提交数据
例如提交表单或者上传文件,数据包含在请求体中。 -
PUT:更新资源
-
DELETE:删除资源
-
HEAD:检查资源的存在性,以及获取资源的元信息(如Content-Type、Content-Length等)。
类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头。 -
CONNECT:建立连接隧道,用于代理服务器
通常用于SSL加密服务器的链接(经由非加密的HTTP代理)。 -
OPTIONS:列出可对资源实行的请求方法,用来跨域请求
可以用来检查服务器支持的HTTP方法。 -
TRACE:让web服务器端将之前的请求通信环回给客户端
回显服务器收到的请求,主要用于测试或诊断。 -
PATCH:对资源进行部分修改
与PUT请求不同,PATCH请求用于更新资源的部分内容,而不是替换整个资源。
POST和PUT请求的区别
PUT请求
-
通常用于更新或替换服务器上的资源。
-
使用PUT请求时,客户端需要将整个资源的新版本发送到服务器。
如果服务器上已存在该资源,则用客户端提交的新版本替换原有的资源。如果该资源不存在,则会创建一个新的资源。 -
PUT请求具有幂等性,即多次发送相同的PUT请求会产生相同的结果。
这是因为PUT请求用于更新或替换资源,所以无论发送多少次,只要数据相同,结果都是一致的。
POST请求
-
通常用于创建新的资源或提交数据到服务器进行处理。
例如,在提交表单、上传文件、提交密码或支付信息时,通常会使用POST请求。 -
POST请求不具备幂等性,即多次发送相同的POST请求可能会导致不同的结果。
因为每次POST请求都会在服务器上创建新的资源或执行某些操作。