get、post、put、delete区别与含义

最近读了http的入门书籍《图解HTTP》,虽然仍然是一知半解,但是总得写点东西加深一下印象。

语义
http协议是基于tcp协议的应用层协议,tcp协议作为可靠的传输层协议,因此http协议也是可靠的。

日常开发过程中,最常用的是get post put delete,在http协议的规定中,这四个method属于标准的crud,分别代表了增删改查,存在着语义上的差别。

当然你要是乐意的话,用post获取,用get去做增改也是可以的。只不过不推荐如此罢了。

因为主要是语义上的差别,因此在传输层上来看的话,get和delete post和put是没有任何区别的。不过把应用层协议放到传输层上来看,本身就是一件比较扯的事。

值得一提的是在部分浏览器下,post会发送两个数据包,get只发送一个。这也是有些文章推荐全部用get做优化,不过大部分项目规模都不大,这点优化带来的性能提升几乎看不见。

幂等性
幂等性的概念来自于数学(好像编程都是来自数学,数学家最厉害,研究出来一些东西之后,各位大牛实现成拓展,我们这种去用一下,不求甚解)。

幂等性指的是相同参数的重复执行,获得的副作用都是一致的。譬如get方式获取某个帖子,帖子id不变的话,造成的副作用肯定是一致的,自然是符合幂等的。需要注意的是,这里强调的是相同的副作用,并不是相同的内容。譬如帖子被删除了,再次访问肯定是没有结果的,但是造成副作用仍然是一致的。

同理,无论是put方法去更新一个帖子,还是delete方法去删除一个帖子,无论执行多少次,副作用也全部是一致的。自然也是幂等的。

post方法是最奇特的,毕竟是创建一个帖子,在创建之前,自然不可能得知这个帖子的id。另外三种都是对应资源的uri,唯有post对应的是创建资源的实体。如果访问多次,那么就会创建多个帖子,造成的副作用是不一样的(对应的帖子的id发生了变化,就像往数据库插入相同的记录,id是一直在自增的)。也就是说post不是幂等的。

不过有很多方法去避免这个情况的发生:可以在先生成一个随机字符串存到session、并且埋在表单的隐藏域中,接收到表单提交的数据之后,首先检测这个随机字符串是否存在,如果存在就验证通过、并删除该session,不存在即可认为是重复提交。

还有个思路,在表单提前埋入一个ticket,这个ticket直接和当前操作绑定,提交之后先去判断该ticket是否已经使用,未使用就创建一个资源,已使用就不进行操作。这个ticket肯定要做持久化存储,不过相对于带来的好处,这点资源的消耗是完全可以接受的。

从网上找了一个图:

RESTful
先说下关于restful的概念


1、网络上的所有事物都被抽象为资源(resource);

2、每个资源对应一个唯一的资源标识(resource identifier);

3、通过通用的连接器接口(generic connector interface)对资源进行操作;

4、对资源的各种操作不会改变资源标识;

5、所有的操作都是无状态的(stateless)。

RESTful是一种架构设计风格,提供了设计原则和约束条件,而不是架构。而满足这些约束条件和原则的应用程序或设计就是RESTful架构或服务。是基于http(RPC 是基于TCP协议的)建立的一种接口规范,核心就是资源。目前api开发中,最常用的就是RESTful风格,也就是采用了这个机制。仅仅是看一下这个url就能猜测出对应的方法的作用,省去了大量的理解接口之间逻辑的时间。最大的好处由于RESTful强制所有的操作都必须是stateless的,这就没有上下文的约束,如果做分布式,集群都不需要考虑上下文和会话保持的问题,极大的提高了可伸缩性。
--------------------- 
作者:从别后 
来源:CSDN 
原文:https://blog.csdn.net/cs958903980/article/details/52817116 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/LUOCHENLONG/article/details/83478672