Open bibi7 opened 4 years ago
事实上开发工程师遇到这个问题往往能说点什么出来,比如:
从传参的角度来说,GET请求的数据会附在URL之后,以?分割URL和传输数据,参数之间以&相连,而post往往把数据放在body之中。
从安全性的角度来说,post比get更安全。
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET请求在URL中传送的参数是有长度限制的,而POST没有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
get是幂等的,post是非幂等的
一个正常的http请求中包含着这么几个部分:
<METHOD> <URL> HTTP/1.1\r\n <Header1>: <HeaderValue1>\r\n <Header2>: <HeaderValue2>\r\n ... <HeaderN>: <HeaderValueN>\r\n \r\n <Body Data....>
放屁,详见
从协议本身来说,RFC并没有如此规定,但是Get 不用body是W3C的标准,所以mdn和rfc在这点上表现不一致也情有可原。
我们常听到GET不如POST安全,因为POST用body传输数据,而GET用url传输,更加容易看到。但是从攻击的角度,无论是GET还是POST都不够安全,因为HTTP本身是明文协议。每个HTTP请求和返回的每个byte都会在网络上明文传播,不管是url,header还是body。这完全不是一个“是否容易在浏览器地址栏上看到“的问题。
实际上,GET数据有长度限制“其实是指”URL的长度限制“。URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。且不同的浏览器这一块的限制还不一样,一般说的2048指的是ie8。
这个其实还是对的,客户端可以利用HTTP的Continued协议来这样做:客户端总是先发送所有请求头给服务器,让服务器校验。如果通过了,服务器回复“100 - Continue”,客户端再把剩下的数据发给服务器。如果请求被拒了,服务器就回复个400之类的错误,这个交互就终止。 同时,这个情况只有在请求中带了Expect: 100-continue才会生效。
Expect: 100-continue
GET 和 POST 到底有什么区别? 听说『99% 的人都理解错了 HTTP 中 GET 与 POST 的区别』??
我一直认为这个问题最重要的还是从语义上的区别,用符合规范的方式去实现系统可以减少很多工作量。同时原文这段话我还挺喜欢的:
我们通常在讨论 GET vs POST 的时候,实际上讨论的是 specification,而不是 implementation。什么是 specification?说白了就是相关的 RFC。implementation 则是所有实现了 specification 中描述的代码/库/产品,比如 curl,Python 的 requests 库,或者 Chrome。 POST 请求怎么发送,根本就不是这段 RFC 在讨论的事情。RFC 中只说明了 100 continue 和 Expect header 的联系,比如你想在 GET 请求里带 body,一样可以发送 Expect: 100-continue 并等待 100 continue,这是符合标准的。
我们通常在讨论 GET vs POST 的时候,实际上讨论的是 specification,而不是 implementation。什么是 specification?说白了就是相关的 RFC。implementation 则是所有实现了 specification 中描述的代码/库/产品,比如 curl,Python 的 requests 库,或者 Chrome。
POST 请求怎么发送,根本就不是这段 RFC 在讨论的事情。RFC 中只说明了 100 continue 和 Expect header 的联系,比如你想在 GET 请求里带 body,一样可以发送 Expect: 100-continue 并等待 100 continue,这是符合标准的。
事实上开发工程师遇到这个问题往往能说点什么出来,比如:
从传参的角度来说,GET请求的数据会附在URL之后,以?分割URL和传输数据,参数之间以&相连,而post往往把数据放在body之中。
从安全性的角度来说,post比get更安全。
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET请求在URL中传送的参数是有长度限制的,而POST没有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
get是幂等的,post是非幂等的
来点不一样的
一个正常的http请求中包含着这么几个部分:
get不能有body?
放屁,详见
从协议本身来说,RFC并没有如此规定,但是Get 不用body是W3C的标准,所以mdn和rfc在这点上表现不一致也情有可原。
关于安全性
我们常听到GET不如POST安全,因为POST用body传输数据,而GET用url传输,更加容易看到。但是从攻击的角度,无论是GET还是POST都不够安全,因为HTTP本身是明文协议。每个HTTP请求和返回的每个byte都会在网络上明文传播,不管是url,header还是body。这完全不是一个“是否容易在浏览器地址栏上看到“的问题。
所谓的get参数有长度限制
实际上,GET数据有长度限制“其实是指”URL的长度限制“。URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。且不同的浏览器这一块的限制还不一样,一般说的2048指的是ie8。
post其实会偷偷发两次请求?
这个其实还是对的,客户端可以利用HTTP的Continued协议来这样做:客户端总是先发送所有请求头给服务器,让服务器校验。如果通过了,服务器回复“100 - Continue”,客户端再把剩下的数据发给服务器。如果请求被拒了,服务器就回复个400之类的错误,这个交互就终止。 同时,这个情况只有在请求中带了
Expect: 100-continue
才会生效。来源
GET 和 POST 到底有什么区别? 听说『99% 的人都理解错了 HTTP 中 GET 与 POST 的区别』??
我一直认为这个问题最重要的还是从语义上的区别,用符合规范的方式去实现系统可以减少很多工作量。同时原文这段话我还挺喜欢的: