在PUT请求的URI中包含Id

Jos*_*ale 37 rest

我正在阅读一些关于使用rest服务正确​​使用URI的文档,我遇到了一个基本GET .. DELETE请求的例子.

示例uri是:

获取所有用户

GET http://mydomain.org/api/users
Run Code Online (Sandbox Code Playgroud)

获取特定用户

GET http://mydomain.org/api/users/1
Run Code Online (Sandbox Code Playgroud)

更新用户

PUT http://mydomain.org/api/users/1
Run Code Online (Sandbox Code Playgroud)

删除用户

DELETE http://mydomain.org/api/users/1
Run Code Online (Sandbox Code Playgroud)

用户资源可以是以下形式的JSON或XML:

{
    Id: 1,
    FirstName: 'John',
    LastName: 'Doe'
}
Run Code Online (Sandbox Code Playgroud)

我的问题是这个.要维护REST原则,是否需要在PUT请求的URI中包含资源的id?

abr*_*ham 43

PUT方法请求创建目标资源的状态或用请求消息有效负载中包含的表示定义的状态替换目标资源的状态.

您希望PUT资源与您打算使用的URI相同GET.

RFC 72314.3.4 PUT

  • 这就说得通了。我的假设是 id 总是会随资源一起提供,但我想情况并非总是如此。 (2认同)
  • 事实上,如果您在界面中开始使用URI,您可能很快就会发现从资源表示本身中删除id非常有用. (2认同)
  • RFC-2616已被[RFC-7231]废弃(https://tools.ietf.org/html/rfc7231#section-4.3) (2认同)

Огњ*_*јић 15

我打算问一个类似的问题,但我想我找到了答案.我不确定它是否属于REST原则,但这就是为什么不在URI中包含ID会很糟糕.所以说你的意思PUT是:

PUT http://mydomain.org/api/users
Run Code Online (Sandbox Code Playgroud)

然后您碰巧更新了具有不同ID但具有相同URI的多个用户,因为您的URI中没有ID.然后,重要的是要知道PUT是幂等的http动词.这意味着调用它应该具有与多次调用它相同的效果.因此,网络中的某个中间节点,只要遵循您多次PUT的事实,可能会忽略除一个请求之外的所有节点,因为它们具有相同的URI.最后,那肯定不是你想要的,因为意图是更新多个用户而不仅仅是一个.

  • 我怀疑这是可能的,因为身体会有所不同.即使您正在更新相同的资源,您也可以使用不同的更新(具有不同的值),忽略其中一些是非常意外的行为. (4认同)
  • Огњен Шобајић,只有当请求完全相同时,这才是正确的。假设我们有两个请求 `PUT: /api/users/1`,主体为 `{"name":"Foo"}` 和 `{"name":"Bar"}`。幂等并不意味着第二个请求会被忽略,对吗?这只是意味着执行完全相同的请求与只执行一次具有相同的效果。 (2认同)

Gui*_*ert 5

PUT http://example.com/api/users + bodyhttp://example.com/api/users其行为类似于将键和值放在主体中的地图。如果不存在则创建一个新条目,否则现有条目将被覆盖。

:背后的资源是什么http://example.com/api/users

:与提供的相同GET http://example.com/api/users所有用户的列表

因此,该命令PUT http://example.com/api/users意味着您将所有用户的列表替换为您提供的用户列表。

为了保持一致性,主体应包含用户数组:

[
  {
    Id: 1,
    FirstName: 'John',
    LastName: 'Doe'
  },
  {
    Id: 2,
    FirstName: 'Albert',
    LastName: 'Einstein'
  }
]
Run Code Online (Sandbox Code Playgroud)