1

假设users我的 Mongo 数据库中有一个集合:

users
  _id
  emailAddress
  firstName
  lastName
  passwordHash
  accessLogs: [ ... ]
  createdAt

如您所见,一个用户文档可以包含一个 accessLogs 数组。伟大的。

但是,假设我想更新用户记录并对PUT /users/:id使用该数据库的 RESTful API 发出请求。使用 PUT,您应该取回您输入的内容。假设用户已登录 500 次。为了避免违反 REST,这是否意味着我的 PUT 数据应该包含accessLogs 数组及其所有项目?

我想请求处理程序可以只更新除 accessLogs 之外的所有内容。

4

2 回答 2

4

在最严格的定义中PUT确实应该替换对象的内容。如果你想用部分数据/指令更新现有对象,你应该使用PATCH方法. 这将允许您指定要添加 accessLogs(或以其他方式保持它们不变)并且不必发送整个对象 - 只需说明需要更新的内容。

于 2014-11-24T21:03:28.893 回答
0

在您的情况下,它accessLogs是一个生成的只读属性,因此它不必是您的 PUT 请求的一部分。您也不必发送该_id属性,如果某些属性具有默认值,则您也不必发送这些属性。

PUT 方法请求将封闭的实体存储在提供的 Request-URI 下。如果 Request-URI 引用了一个已经存在的资源,封闭的实体应该被认为是在源服务器上的一个修改版本。

PUT 和 PATCH 请求之间的区别体现在服务器处理封闭实体以修改由 Request-URI 标识的资源的方式上。在 PUT 请求中,包含的实体被认为是存储在源服务器上的资源的修改版本,并且客户端请求替换存储的版本。然而,对于 PATCH,封闭的实体包含一组指令,描述如何修改当前驻留在源服务器上的资源以生成新版本。PATCH 方法会影响 Request-URI 标识的资源,也可能对其他资源产生副作用;即,可以通过应用 PATCH 创建新资源或修改现有资源。

您可以在此处找到类似的问题。

于 2014-11-25T10:37:02.117 回答