每个HTTP请求都包含一个方法 (有时称为verb ),该方法指示对标识的资源执行的操作。

在构建RESTful Web服务时,HTTP方法POST通常用于创建资源,而PUT用于资源更新。 尽管在大多数情况下这很好,但使用PUT进行资源创建也是可行的。 PATCH是资源更新的替代方法,因为它允许部分更新。

一般来说,我们可以说:

  • POST请求在服务器定义的URI上创建子资源。 POST也用作常规处理操作
  • PUT请求在客户端定义的URI处创建或替换资源
  • PATCH请求在客户端定义的URI上更新资源的一部分

但是,让我们多看一些细节,看看如何在HTTP规范中定义这些动词。 这里的相关部分是HTTP RFC(2616)的第9节。

开机自检

RFC将POST的功能描述为:

POST方法用于请求源服务器接受请求中包含的实体作为请求行中Request-URI标识的资源的新下属。

这允许客户端创建资源而无需知道新资源的URI。 例如,我们可以向/ projects发送POST请求以创建一个新项目。 服务器现在可以将项目创建为/ project的新下属,例如: / projects / 123 。 因此,在使用POST进行资源创建时,服务器可以确定新创建的资源的URI(通常是ID)。

服务器创建资源时,应以201(已创建)状态代码和一个指向新创建资源的Location标头进行响应。

例如:

请求:

 POST /projects HTTP/ 1.1  Content-Type: application/json  { "name" : "my cool project" , ...  } 

响应:

 HTTP/ 1.1 201 Created  Location: https: //cool.api.com/projects/123 

POST不是幂等的 。 因此,多次发送相同的POST请求可能会导致创建多个资源。 根据您的需求,这可能是一个有用的功能。 如果没有,则应该进行一些验证,并确保仅根据某些自定义条件(例如,项目名称必须唯一 )创建一次资源。

RFC还告诉我们:

POST方法执行的操作可能不会导致可以由URI标识的资源。 在这种情况下,适当的响应状态是200(确定)或204(无内容),这取决于响应是否包括描述结果的实体。

这意味着POST不一定需要创建资源。 它也可以用于执行一般操作(例如,开始批处理作业,导入数据或处理某些操作)。

POST和PUT之间的主要区别是请求URI的含义不同。 HTTP RFC表示:

POST请求中的URI标识将处理封闭实体的资源。 [..]相反,PUT请求中的URI标识请求[..]内的实体,并且服务器不得尝试将请求应用于其他资源。

对于PUT请求,客户端需要知道资源的确切URI。 我们无法将PUT请求发送到/ projects,并期望在/ projects / 123上创建一个新资源。 相反,我们必须将PUT请求直接发送到/ projects / 123 。 因此,如果我们要使用PUT创建资源,则客户端需要知道(如何生成)新资源的URI / ID。

在客户端能够为新资源生成资源URI / ID的情况下,PUT实际上应优先于POST。 在这些情况下,资源创建通常是幂等的 ,这是对PUT的明确提示。

可以使用PUT创建和更新资源。 因此,将PUT请求发送到/ projects / 123可能会创建项目(如果该项目不存在)或替换现有项目。 HTTP状态代码应用于通知客户端资源是否已创建或更新。

HTTP RFC告诉我们:

如果创建了新资源,则原始服务器务必通过201(已创建)响应通知用户代理。 如果修改了现有资源,则应发送200(确定)或204(无内容)响应代码以指示请求已成功完成。

一般而言,如果确切的资源URI是已知的并且操作是幂等的 ,则PUT通常是比POST更好的选择。 在大多数情况下,这使PUT成为更新请求的理想选择。

但是,对于资源更新,应该记住一个怪癖。 根据RFC,PUT应该用新资源替换现有资源。 这意味着我们无法进行部分更新。 因此,如果要更新资源的单个字段,则必须发送包含完整资源的PUT请求。

补丁

HTTP PATCH方法在RFC 5789中定义为对前面提到的HTTP RFC的扩展。 当使用PUT替换现有资源时,使用PATCH对资源进行部分修改。

引用RFC:

使用PATCH [..],封闭的实体包含一组指令,这些指令描述应如何修改当前驻留在原始服务器上的资源以产生新版本。 PATCH方法影响由Request-URI标识的资源,并且可能对其他资源也有副作用。

因此,类似于POST的PATCH也可能会影响请求URI所标识资源以外的资源。

通常,PATCH请求使用与应更新的资源相同的格式,而忽略了不应更改的字段。 但是,不必一定是这种方式。 也可以使用单独的修补程序格式 ,该格式描述了如何修改资源。

PATCH既不安全也不是幂等的 。

也许您想知道在哪些情况下部分资源更新不是幂等的。 这里的一个简单示例是将项目添加到现有列表资源中,例如将产品添加到购物车中。 多个(部分)更新请求可能会将产品多次添加到购物车中。

翻译自: https://www.javacodegeeks.com/2020/02/rest-http-methods-post-vs-put-vs-patch.html

REST / HTTP方法:POST与PUT与PATCH相关推荐

  1. java的人patch方法_java – Spring MVC PATCH方法:部分更新

    我有一个项目,我使用Spring MVC Jackson构建REST服务.让我们说我有以下java实体 public class MyEntity { private Integer id; priv ...

  2. linux patch使用方法,Linux patch命令

    patch 英 [pætʃ]   美 [pætʃ] n.补丁,补片;眼罩;斑点;小块 vt.修补,拼凑;暂时遮掩一下;修理,平息(吵架等);用美人斑装饰(脸) vi.打补丁 第三人称单数: patch ...

  3. buildroot package打patch方法

    我们修改了busybox的源码和配置文件,需要通过在buildroot package里面通过打patch的方式,并指定我们的配置文件进行编译: 1.制作patch方法说明 patch文件也叫补丁,就 ...

  4. axios请求五种方法

    一.介绍 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中. 可以提供以下服务: 1.从浏览器中创建XMLHttpRequests 2.从node.js创 ...

  5. input发送a.jax_JAX-RS 2.0中的透明PATCH支持

    input发送a.jax PATCH方法是最不受欢迎的HTTP方法之一,因为直到最近才真正没有一种标准的PATCH格式. 一段时间以来,它已经针对JSON进行了标准化,因此有很多库可以为您完成繁重的工 ...

  6. JAX-RS 2.0中的透明PATCH支持

    PATCH方法是最不受欢迎的HTTP方法之一,因为直到最近才真正没有一种标准的PATCH格式. 一段时间以来,它已经针对JSON进行了标准化,因此有很多库可以为您完成繁重的工作. 出于本博客的目的,我 ...

  7. linux 卸载 patch,Oracle RAC 平台下 Patch 安装与卸载 步骤 收藏

    之前整理过一篇Oracle Patch 的文章,参考: 关于Oracle Patch 的知识,参考之前的文章. 这篇主要是演示下RAC 平台下Patch 的安装与卸载. 一.  Path 安装说明 在 ...

  8. the coons patch

    待解决问题:给出四条曲线,找到一个以这四条曲线作为边界的参数曲面 一个经典的方法就是bilinearly blended Coons patch 双线性混合coons面:插值这些曲线边界 一.论文中& ...

  9. 使用 patch 命令打补丁

    之前的这篇文章 git 导出差异 diff 文件 写了导出 diff .patch 文件. 拿到 patch 文件,用 patch 命令可以快速的把修改内容合入,合入后在 git 上是已修改的状态,如 ...

  10. 如何使用git 生成patch 和打入patch

    平时我们在使用git 管理项目的时候,会遇到这样一种情况,那就是客户使用git 生成patch 给到我们,那我们就需要把客户给到patch 打入到我们的project ,基于这样一个场景,我把git ...

最新文章

  1. 仅用2年过渡到自研ARM芯片,苹果的底气从何而来?
  2. 135.003 智能合约后端优化和产品化
  3. C++之shared_ptr总结
  4. mysql 四 表操作
  5. 三国志战略版服务器维护延时,三国志战略版服务器爆满是多少人 爆满进不去怎么办...
  6. 利用C#实现标准的 Dispose模式
  7. java取邮箱前缀_java抓取网页或文件中的邮箱号码
  8. 高并发下Java多线程编程基础
  9. JSP访问数据库,Session对象和九大内置对象
  10. 事物日志恢复 mysql_浅谈SQL Server中的事务日志(五)----日志在高可用和灾难恢复中的作用...
  11. 299 Bulls and Cows 猜数字游戏
  12. 章子欣父亲发声:感谢提供帮助的媒体,包括百度
  13. 介绍10款常用的JAVA测试工具
  14. 还在低效搬砖?看 BIM 如何颠覆了土木工程?
  15. mysql主从的原理_Mysql主从的原理
  16. 电脑也能管理服务器安全 安全狗服云PC端V2.3发布
  17. 4.XXE (XML External Entity Injection)
  18. Adobe出现正版验证提示如何解决?Adobe正版校验关闭教程
  19. 双向晶闸管触发电路工作原理图
  20. Lin法求解多方式方程共轭复根

热门文章

  1. 【SPFA】重建道路(jzoj 1212)
  2. 【最短路】【SPFA】电车 (luogu 1346)
  3. 15、sql编程基本语法介绍
  4. 常用公有云接入——谷歌
  5. 集合框架 Queue---BlockingQueue详解
  6. 阿里巴巴对Java编程【单元测试】的规约
  7. 一篇文章搞定面试中的二叉树
  8. jQuery实现判断li的个数从而实现其他功能
  9. Servlet使用适配器模式进行增删改查案例(IDeptService.java)
  10. win10控制视频声音大小