当前位置: 首页 > 知识库问答 >
问题:

REST API - 如何处理 PUT 方法中的可选参数?使用 PATCH 方法实现有何不同

徐焱
2023-03-14

我对带有可选参数的put方法有点困惑。

假设模式是

java prettyprint-override">Pet {
  name 
  catagory
  tag  (optional)
}

当我想创建一个Pet时,我可以使用post方法,可以省略标签。当我想更新一个Pet时,问题就来了。根据超文本传输协议规范,PUT方法将通过替换整个资源来更新实体,这意味着我需要传递tag参数。如果我没有传递tag,默认值将为空,但会导致现有标签被覆盖为空。

对于pat方法,无论是否可选,它都只会更新部分参数。很清楚。

我不知道我是否误解了什么,目前,在PUT方法中,我需要弄清楚传递了什么参数,然后更新相应的字段。但PATCH方法似乎也是如此。

共有1个答案

董哲
2023-03-14

需要理解的一件重要事情是,HTTP规范描述了语义(不同的请求意味着什么),但没有描述实现(如何实现)。这是经过深思熟虑的——规范基本上说您的服务器应该假装是密钥/值存储,但它并不限制您如何实现它。

PUT大致类似于保存文件:“这是一个字节数组,用这个键保存它”。如果您的存储是一个文件系统,那么您只需将字节数组写入磁盘。如果您的存储是内存缓存,那么您只需更新您的缓存副本。

如果您的存储是某个RDBMS数据库?然后,您需要做一些工作,确定数据库中的哪些行需要更改,以及需要向数据库发送哪些命令才能更改。

关键是客户机不在乎--作为服务器,您可以将底层存储从RDBMS更改为文档存储,再更改为文件系统,这与客户机无关。

在PUT方法中,我需要确定传递了什么参数,然后更新相应的字段。但这似乎与PATCH方法相同。

是的。在这两种情况下,您都需要弄清楚如何就地编辑您的资源。

PUT可能会感觉简单一点,因为它在语义上等同于“删除旧版本,然后创建新版本”。您不必担心将提供的数据合并到您已经存储的状态。

 类似资料:
  • 我试图在我的客户端使用JAX RS的CXF实现补丁方法。首先,我将补丁注释定义为 参考这里的内容:如何为JAX-RS提供@PATCH注释? 然后我发现@PATCH被添加到CXF 3.1.2中,所以我在我的专家的pom中更改了版本.xml并且内部有,代码实际上看起来与我上面发布的内容完全相同。 但是,当我尝试在我的服务定义上使用此注释时 正如我在上面发布的queston链接中所说的,我以< code

  • 首先,一些定义: PUT在第9.6节RFC 2616中定义: PUT方法请求将封闭的实体存储在提供的request-uri下。如果Request-URI引用的是一个已经存在的资源,则所包含的实体应被视为驻留在原始服务器上的实体的修改版本。如果请求URI没有指向现有资源,并且该URI能够被请求的用户代理定义为新资源,则源服务器可以使用该URI创建资源。 修补程序定义在RFC 5789: 补丁方法请求

  • 问题内容: 首先,一些定义: PUT在9.6节RFC 2616中 定义: PUT方法请求将封闭的实体存储在提供的Request-URI下。如果Request-URI引用了已经存在的资源, 则应 将封闭的实体 视为原始服务器上的 资源 的修改版本 。如果Request- URI没有指向现有资源,并且请求用户代理能够将该URI定义为新资源,则原始服务器可以使用该URI创建资源。 PATCH在RFC 5

  • 让我们考虑一下下面的课程 让我们考虑一下这个类有一个可选对象,比如: 是否可以在对象上调用方法,而无需检查是指完整的对象还是仅指空的对象()。比如: 不幸的是,这段代码无法编译。如何做到这一点?

  • 我不知道PATCH和PUT方法之间的确切区别。有人能告诉我什么时候我们应该用适当的例子来使用这个方法吗?

  • 我读了一篇关于使用选项作为方法参数的文章,大家一致认为永远不要使用选项作为方法参数。 Guava可选作为可选参数的方法参数 这种使用作为方法参数的情况合法吗?如果不是,我如何使这是可列举的?