讲清楚POST和PUT的区别

Posted 赖勇浩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了讲清楚POST和PUT的区别相关的知识,希望对你有一定的参考价值。

在RESTful概念里,HTTP Method代表不同的语义,GET/PATCH/DELETE没有太多的困惑,但是POST/PUT经常让人分不清楚。

有说POST用来创建,PUT用来修改的;也有PUT用来创建,POST用来修改的。各种一词,抛到微信群里能瞬间吵起来。

其实都不对,POST和PUT都能用来创建。它们最重要的区别是由它们最基础的概念决定的,那就是PUT要实现为幂等的。所谓的幂等,就是:

在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。

所以在实现中,POST用来创建某一类资源的一个实例,如:

POST /articles/

创建一篇文章对象,这篇文章对象的ID是由后端决定的,比如后端使用的是UUID作为ID的生成算法,后面这篇文章的URL可能是这样的/articles/35c6d1b227454fad89fd238759896b3f/。这个显然难看,而且不利于SEO,所以成熟的CRM系统都会选择让作者自己定义URL的一部分,也就是SLUG,比如WordPress中的Permalink概念。

如果使用这种方式,就应当用PUT方法来创建文章:

PUT /articles/20-most-amazing-coffee-shops-in-manhattan/

简单小结一下,就是如果调用方(客户端)能决定URL,那就用PUT方法来创建,否则就是用POST方法。

最后,GET+PUT=REPLACE,因为在GET的时候已经知道了URL,自然是用PUT方法来替换了,类似从文件架上拿下文件修改后放回原位。

在应用场景中,显然应当优先使用PUT方法来创建资源,比如商品管理中的新增商品,如果多次点击保存按钮,发送的是POST请求将导致创建多个同样的商品,而使用PUT则没有这个尴尬(重复:PUT是幂等的),更重要的是从业务角度出发,这也更有利于SEO。

最后顺便聊聊PATCH方法,其实PATCH方法也可以创建资源:如果服务器中不存在这个资源,就创建之,但这个是不一定的,因为PATCH定义用于修改资源的一部分,那么它提交的数据可能不足以创建资源(缺少数据表定义中的必要属性),比如一个修改用户邮箱地址的PATCH请求因为缺乏用户名而无法创建一个新的资源。

PATCH也不一定是幂等的。比如:

PATCH /items/potato/
stock=1000

可以更新商品的库存,不管调用多少遍,库存都是1000单位。但PATCH也可以设计为指令,如:

PATCH /items/potato/
op=sub&stock=1

表示为减去1单位的库存,那么多次调用的结果是不同的。比如原有库存1000单位,调用1次后是999单位,2次以后就是998单位了。
考虑到网络不稳定、不安全,我们的接口应当尽量设计为幂等的,但有可能没有办法达到。这是需要注意的。

以上是关于讲清楚POST和PUT的区别的主要内容,如果未能解决你的问题,请参考以下文章

讲清楚POST和PUT的区别

C语言用例子一次性讲清楚结构体和联合体区别,xdm看过来!

讲清楚VO,BO,PO,DO,DTO的区别

讲清楚VO,BO,PO,DO,DTO的区别

讲清楚,说明白!磁盘管理

讲清楚了