GET就是获取资源,POST就是创建资源,PUT就是更新资源,DELETE就是删除资源
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET方法只能传输ASCII码值(0-127),而POST可以传输任意数据类型
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST没有。
这里对于地址长度的限制要声明一点,http协议并未规定get和post的长度限制,get的最大长度限制是因为浏览器和web服务器限制了URL的长度,不同的浏览器对地址长度的限制也是不同的。要强调的是,这个长度的限制不是对于参数长度的限制,而是对于整个URL的长度。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中。
获取资源的速度:get更快
post在真正接收数据前会先将请求头发送给服务器进行确认,收到服务器回复100的确认码后,才开始发送正文;但是get会在第三次握手时就交付数据。get的总耗是post的2/3左右
- post请求的过程:
- (1)浏览器请求tcp连接(第一次握手)
- (2)服务器答应进行tcp连接(第二次握手)
- (3)浏览器确认,并发送post请求头(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)
- (4)服务器返回100 Continue响应
- (5)浏览器发送数据
- (6)服务器返回200 OK响应
-
- get请求的过程:
- (1)浏览器请求tcp连接(第一次握手)
- (2)服务器答应进行tcp连接(第二次握手)
- (3)浏览器确认,并发送get请求头和数据(第三次握手,这个报文比较小,所以http会在此时进行第一次数据发送)
- (4)服务器返回200 OK响应
PUT和POS都有更改指定URI的语义.但PUT被定义为idempotent(幂等)的方法,POST则不是
idempotent的方法:如果一个方法重复执行多次,产生的效果是一样的,那就是idempotent的。也就是说:
PUT请求:如果两个请求相同,后一个请求会把第一个请求覆盖掉。(所以PUT用来改资源)
Post请求:后一个请求不会把第一个请求覆盖掉。(所以Post用来增资源)
创建操作可以使用POST,也可以使用PUT,区别在于POST 是作用在一个集合资源之上的(/uri),而PUT操作是作用在一个具体资源之上的(/uri/xxx),再通俗点说,如果URL可以在客户端确定,那么就使用PUT,如果是在服务端确定,那么就使用POST,比如说很多资源使用数据库自增主键作为标识信息,而创建的资源的标识信息到底是什么只能由服务端提供,这个时候就必须使用POST。
参考答案
HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用。幂等性属于语义范畴,正如编译器只能帮助检查语法错误一样,HTTP规范也没有办法通过消息格式等语法手段来定义它。
HTTP协议规定,POST方法修改资源状态时,URL指示的是该资源的父级资源,待修改资源的ID信息在请求体中携带。而PUT方法修改资源状态时,URL直接指示待修改资源。因此,同样是创建资源,重复提交POST请求可能产生两个不同的资源,而重复提交PUT请求只会对其URL中指定的资源起作用,也就是只会创建一个资源。
同理delete请求也是幂等的,用来执行删除操作