在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的区别相关推荐

  1. 通俗地讲清楚fit_transform()和transform()的区别

    网上抄来抄去都是一个意思, fit_transform是fit和transform的组合. 我们知道fit(x,y)在新手入门的例子中比较多,但是这里的fit_transform(x)的括号中只有一个 ...

  2. linux下不同arm 编译器的异同

    1.EABIarm-2008q3-39-arm-none-eabi  Sourcery G++ Lite 2008q3-39 All versions...  Sourcery G++ for ARM ...

  3. 教学中常用的计算机软件及作用,信息技术教学中常用的教学方法有哪些

    信息技术教学中常用的教学方法有哪些 根据对平时教学的总结,归纳出信息技术教学中行之有效的教学法:讲授教学法.示范教学法.同步教学法.探索教学法.任务教学法等. 一.讲授教学法 讲授教学法就是教师对知识 ...

  4. 教学中常用的计算机软件有哪些,信息技术教学中常用的教学方法有哪些

    信息技术教学中常用的教学方法有哪些 根据对平时教学的总结,归纳出信息技术教学 中行之有效的教学法: 讲授教学法.示范教学法. 同步教学法.探索教学法.任务教学法等. 一.讲授教学法 讲授教学法就是教师 ...

  5. 中级前端面试秘籍(含详细答案,15k级别)

    前言 题外话:关于中级 -> 高级的进阶,我也写了一篇文章,希望对你有帮助: 写给初中级前端的高级进阶指南 HTML篇 HTML5语义化 html5语义化标签 百度ife的h5语义化文章,讲得很 ...

  6. 对智能制造知识整理和ERP,PLM,MES核心系统集成分析

    作者:人月神话,新浪博客同名 简介:多年SOA规划建设,私有云PaaS平台架构设计经验,长期从事一线项目实践 这篇文章对智能制造相关知识点进行整理,其中基础知识整理部分来源于对<智能制造之路-数 ...

  7. 信息学 计算机奥林匹克竞赛辅导,信息学奥林匹克竞赛辅导心得(转载)

    青少年信息学奥林匹克联赛(NOIP)普及的重点是根据中学生的特点,培养学生学习计算机的兴趣,使得他们对信息技术的一些核心内容有更多的了解,提高他们创造性地运用程序设计知识解决实际问题的能力.通过多年的 ...

  8. 【巨人的肩膀】阿里技术专家详解DDD

    导读 对于一个架构师来说,在软件开发中如何降低系统复杂度是一个永恒的挑战,无论是 94 年 GoF 的 Design Patterns , 99 年的 Martin Fowler 的 Refactor ...

  9. 写给你的中级前端面试秘籍(含详细答案,15k级别)

    HTML篇 HTML5语义化 html5语义化标签 百度ife的h5语义化文章,讲得很好,很多不错的公司都会问语义化的问题. CSS篇 CSS常见面试题 50道CSS经典面试题 CSS基础有的公司很重 ...

最新文章

  1. 计算机专业python教材_计算机专业几本必看的书!
  2. 运维人员20道必会iptables面试题
  3. C 语言编程 — uint8_t / uint16_t / uint32_t /uint64_t
  4. PCB板查短路点的一种技巧 (转载)
  5. 降低Java占用_如何减少JAVA应用程序的CPU使用率?
  6. destroy 方法_线程方法destroy()和stop(Throwable)在JDK 11中删除
  7. python subprocess.Popen简明总结
  8. Hive thrift服务(将Hive作为一个服务器,其他机器可以作为客户端进行访问)
  9. Go语言内存对齐详解
  10. 程序员音乐_预订音乐会的程序员指南
  11. 计算机指令vbs,vbs脚本大全,配有实例 DOS命令,批处理 脚本 代码
  12. 必读科普书籍科普三部曲《变化》《见微知著》《探索生命》
  13. java bigram_Android (Java) 编码惯例及最佳实践
  14. modelsim/Questasim中添加xilinx ip库,并仿真成功
  15. JavaWeb技术之JSP
  16. 【网易实习准备】往年笔试题目练习
  17. gedit文本编辑器的设置
  18. 102-首发URSINA中文入门指南-打开山河社稷图
  19. 电荷放大器+低通滤波器的设计
  20. 蓝桥杯单片机——数码管的动态显示(4)

热门文章

  1. 使用progressbar显示进度条
  2. 用循环语句解决简单问题,JAVA
  3. 巡检人员定位系统是如何实现智能巡检的?
  4. 开发经理应该具备怎样的素质
  5. maven指定配置文件打包
  6. 手机在线修改全国计算机等级考试照片尺寸,你会吗?
  7. DUMA: Reading Comprehension with Transposition Thinking
  8. 有了一个wallop
  9. U盘中毒文件被隐藏的解决方法
  10. Linux shell判断cpu架构