使用PUT和POST更新REST资源

时间:2017-07-06 13:30:19

标签: rest api restful-architecture api-design

我有理解REST原则的更新资源。

例如,此响应包含资源的ID

GET / users / 5 { “user_id”:5 “first_name”:“约翰”, “last_name”:“Doe”, “minutes_active”:10

} 这假设资源的id是请求的URL中所述的

GET /users/5
{
"first_name" : "John",
"last_name" : "Doe",
"address": 
{
"street" : "First Street 10",
"postal" : "0000",
"city": "Dublin"
},
"phones": [
{
"type" : "work",
"number" : "555 473-0000",
},
{
"type" : "home",
"number" : "555 473-0000",
}]
}

如果我只想更新地址,我正在考虑使用以下选项之一。

1.
POST /users/5
{
"address": 
{
"street" : "First Street 10",
"postal" : "0000",
"city": "Dublin"
}
}

2.
PUT /users/5
{
"address": 
{
"street" : "First Street 10",
"postal" : "0000",
"city": "Dublin"
}
}

3.
PUT /users/5/address
{
"address": 
{
"street" : "First Street 10",
"postal" : "0000",
"city": "Dublin"
}
}

虽然POST不是幂等的,但在这种情况下它总是做同样的工作(充当幂等),以及PUT。我在某处读到这种类型的请求被认为是部分更新,对于这种类型的请求,我们应该使用PATCH。

此时我想避免使用PATCH,并使用其他替代方法。

此外,如果我将地址隔离为/ users / 5 / address中的单独资源,我可以使用PUT,这将是一个完全遵循REST原则的解决方案。但这可能是我开发人员想要更新fe的问题。使用单个请求的电话和地址。

如果我真的想要使用选项1或2(以及一些巨大的系统,例如zendesk,twitter正在这样做),我是否可以遇到任何我此时未真正看到的严重问题?

1 个答案:

答案 0 :(得分:1)

REST的答案是:你会如何使用网站?

你将获取用户配置文件的当前表示,并包含int表示将是一些链接,其中包含提示代理(您)的语义提示,每个链接是什么对于。您知道您的目标是更改地址,将遵循GET链接,检索包含表单的表示,包含一堆字段和指示客户如何提交表单的链接。因此,您将提交表单:数据的表示将被发送(POST)到某个资源,而这些资源又会与域通信以产生您想要的副作用。

...或

你将获取用户配置文件的当前表示,并包含int表示将是一些链接,其中包含提示代理(您)的语义提示,每个链接是什么对于。您知道您的目标是更改地址,将遵循GET链接,检索表示 的地址,您将在您喜欢的文本编辑器中更新。然后,您将新表示返回到相同的资源,该资源更新地址文档的服务器副本。

因此,如果您使用POSTPUT,“REST原则”并不在意 - 只要您以与RFC一致的方式使用它们。 REST非常关心您对所有资源使用POST和PUT的相同方式,以及您发送给客户端的表示指示客户端行为(而不是在自定义响应集中编程)。

  

此外,如果我将地址隔离为/ users / 5 / address中的单独资源,我可以使用PUT,这将是一个完全遵循REST原则的解决方案。但这可能是我开发人员想要更新fe的问题。使用单个请求的电话和地址。

这不是问题 - 它有两个不同的答案。

一种可能性是您始终将手机包含地址,让代理商决定要做出哪些更改。

但“高级”答案是您有两种不同的资源 - 一种用于编辑地址,另一种资源用于编辑地址和电话号码。 HTTP资源是关于域与其使用者之间的集成协议;如果你想引入一个新的协议,你只需实现一个新的资源系列来支持它,然后添加宣传它存在的链接。

GET /changeOfAddressForm?user=5

GET /changeContactDetailsForm?user=5