Rest 在PUT操作期间在保存之前修改资源

Rest 在PUT操作期间在保存之前修改资源,rest,put,Rest,Put,我找不到以下问题的任何规范或指导。 我有一个资源,它的表示是元素的集合,或者换句话说,这是我的契约,相同对象的集合 {[ { el: 1 }, { el: 2 }, { el: 1 }, ] } 用户在放置包含重复项的集合时,我的业务需求是删除所有重复项并保存它。 结果集合将只包含el:1和el:2 它会打破现有的REST模式吗?如果是这样,我将如何以休息投诉的方式进行 我也会撒谎,不知何故,我会通知客户重复的被删除和修改的资源可用,但找

我找不到以下问题的任何规范或指导。 我有一个资源,它的表示是元素的集合,或者换句话说,这是我的契约,相同对象的集合

{[
  {
     el: 1
  },
  {
     el: 2
  },
  {
     el: 1
  },
 ]
}
用户在放置包含重复项的集合时,我的业务需求是删除所有重复项并保存它。 结果集合将只包含el:1和el:2 它会打破现有的REST模式吗?如果是这样,我将如何以休息投诉的方式进行

我也会撒谎,不知何故,我会通知客户重复的被删除和修改的资源可用,但找不到合法的响应代码

RFC 7231定义了

PUT方法请求创建目标资源的状态,或将其替换为请求消息负载中包含的表示所定义的状态

源服务器应验证PUT表示是否与服务器对目标资源的任何约束一致,这些约束不能或不会被PUT…更改。。。。当PUT表示与目标资源不一致时,源服务器应通过转换表示或更改资源配置使其一致,或使用包含足够信息的适当错误消息进行响应,以解释表示不合适的原因

因此,可以使用PUT请求的消息体中提供的表示,并通过剥离重复项来转换该表示

这并不令人惊讶——HTTP专注于定义请求和响应的语义;服务器在幕后实际做的是一个实现细节

除了用户代理请求的意图和源服务器响应的语义所能表达的内容外,HTTP并没有准确定义PUT方法如何影响源服务器的状态

但是,如果服务器需要更改资源的表示形式,则响应会受到一些限制

原始服务器在成功响应PUT时不得发送验证程序标头字段(第7.2节),如ETag或Last Modified字段,除非请求的表示数据在未对正文应用任何转换的情况下保存(即,资源的新表示数据与PUT请求中接收的表示数据相同)而validator字段值反映了新的表示形式。此要求允许用户代理知道它在内存中的表示形式何时因PUT而保持最新,因此不需要再次从源服务器检索,以及新的验证器在响应中接收的数据可用于未来的有条件请求,以防止意外覆盖(第5.2节)

…因此,您必须对返回的元数据稍微小心一点,以便一般客户端知道如何请求更新的表示

但对客户机来说,什么才是合适的答案呢?客户机如何知道必须检索新资源

HTTP响应包含、状态行、可选标头字段和消息正文

在PUT响应成功的情况下,消息体将是“操作状态的表示”。编码到响应中的信息往往是特定于域的。因此,它可能是一个HTML页面,上面写着“成功,我们更新了资源,这里有一些有用的链接。”或者它可能是一个HTML页面,上面写着“成功了,我们已经更新了资源--但是我们不得不对您发送给我们的内容进行一些更改,以下是一些有用的链接。”

因此,最终消费者很容易知道发生了什么,他们只需阅读答案

有趣的问题是:泛型组件是如何知道的?答案是,我们获取我们想要与泛型组件共享的信息,并用它们理解的语言来表达:规范中描述的状态行和标题中元数据的语义

的语义要求在成功放置资源时使缓存项无效;因此可以免费收回旧的表示


但是,如果服务器选择承认它未经修改就接受了建议的表示,那么服务器可以通过包括验证器头字段来向通用组件指示这一点。该字段向通用组件发出信号,表示可以缓存来自请求的消息体,并且验证器与表示匹配从消息正文(这样验证程序就可以在后续操作中使用。

当您需要删除数据时,可以调用
delete
方法,而不是
PUT
方法。此外,如果您要求使用“REST模式"请告诉我们您当前的
PUT
调用是什么样子的,或者您认为它应该是什么样子的,然后我们会尽力提供帮助。我不是真的想删除,我想清理传入的数据。在保存之前,我需要删除重复的数据。如果您要求使用RESTful方法,您可能需要更改您想要的内容。如果您想坚持换句话说:你试图实现的似乎不是RESTful的,你的JSON响应也没有遵循REST,假设这确实是一个资源的响应,正如你在问题中所解释的那样。你忽略REST,只是按照自己的方式去做怎么样?为什么不是REST?PUT是幂等的t、 我的HTTP请求(上面的示例)无论同一请求执行多少次,都会在服务器上产生相同的状态,对吗?唯一不同的是,它将被清除。其中规范规定传入的请求必须等于服务器上的状态?我的清除总是在服务器上产生相同的状态。问题是我如何才能将其发送给用户,我不能在specA
PUT
中查找任何内容不会删除资源,在您的