讲清楚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概念。
在Wordpress中自定义文章的SLUG
如果使用这种方式,就应当用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单位了。
考虑到网络不稳定、不安全,我们的接口应当尽量设计为幂等的,但有可能没有办法达到。这是需要注意的。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值