我正在阅读一些关于使用rest服务正确使用URI的文档,我遇到了一个基本GET .. DELETE请求的例子。
示例uri是:
获取所有用户
GET http://mydomain.org/api/users
获取特定用户
GET http://mydomain.org/api/users/1
更新用户
PUT http://mydomain.org/api/users/1
删除用户
DELETE http://mydomain.org/api/users/1
用户资源可以是以下形式的JSON或XML:
{
Id: 1,
FirstName: 'John',
LastName: 'Doe'
}
我的问题是这个。要维护REST原则,是否需要在PUT请求的URI中包含资源的ID?
答案 0 :(得分:41)
答案 1 :(得分:15)
我打算问一个类似的问题,但我想我找到了答案。我不确定它是否属于REST原则,但这就是为什么不在URI中包含ID会很糟糕。
所以说你的PUT
就像:
PUT http://mydomain.org/api/users
然后您碰巧更新了具有不同ID的多个用户,但是相同的URI导致您的URI中没有ID。然后,重要的是要知道PUT是幂等的http动词。这意味着调用它应该具有与多次调用它相同的效果。因此,网络中的某个中间节点,只要遵循您多次PUT的事实,可能会忽略除一个请求之外的所有节点,因为它们具有相同的URI。最后,这不是你想要的,因为目的是更新多个用户而不仅仅是一个。
答案 2 :(得分:1)
PUT http://example.com/api/users + body
的行为类似于带有键http://example.com/api/users
和值body的地图的放置。如果不存在,则会创建一个新条目,否则将覆盖现有条目。
问题: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'
}
]
答案 3 :(得分:0)
在放置请求的 URL 中包含 id 的另一个好处是 CREATE/UPDATE 函数可以共享一些逻辑。
假设您有一个包含 3 列的用户表。
id(primary key, auto increment) | name | age
创建用户将生成一个 ID。
POST /users
{
name: "foo"
age: 25
}
-> generate id 123
因为 id 在 URL 中,所以您可以使用相同的请求正文结构来更新用户。
PUT /users/123
{
name: "bar"
age: 25
}
这可能与 REST 主体关系不大,但它可以根据您的语言/框架在实践中简化请求处理的代码。