【问题标题】:Update REST resource using PUT and POST使用 PUT 和 POST 更新 REST 资源
【发布时间】:2017-07-06 13:30:18
【问题描述】:

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

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

获取 /users/5 { “用户 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 正在这样做),我会遇到任何我目前没有真正看到的严重问题吗?

【问题讨论】:

    标签: rest api restful-architecture api-design


    【解决方案1】:

    REST 的答案是:您将如何处理网站?

    您将获取用户配置文件的当前表示,并包含该表示将是许多 链接,以及提示代理(您)的语义提示,关于每个链接是什么为了。您知道您的目标是更改地址,将按照 GET 该链接,检索包含表单的表示,其中包含一堆字段和指示客户端如何提交表单的链接。因此,您将提交表单:数据的表示将被发送 (POST) 到某个资源,该资源将依次与域通信以产生您想要的副作用。

    或者...

    您将获取用户配置文件的当前表示,并包含该表示将是许多 链接,以及提示代理(您)的语义提示,关于每个链接是什么为了。您知道您的目标是更改地址,将按照获取该链接,检索表示 地址,您将在您最喜欢的文本编辑器中更新该地址。然后你会将新的表示放回相同的资源,这会更新地址文档的服务器副本。

    所以“REST 原则”并不关心您使用的是POST 还是PUT——只要您以符合 RFC 的方式使用它们即可。 REST 非常关心您对所有资源以相同方式使用 POST 和 PUT,以及您发送给客户端的表示指示客户端行为(而不是在自定义响应集中编程)这一事实。

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

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

    一种可能性是您始终将电话与地址一起包含在内,并让代理决定要进行哪些更改。

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

    GET /changeOfAddressForm?user=5
    
    GET /changeContactDetailsForm?user=5
    

    【讨论】:

      猜你喜欢
      • 2017-12-26
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 2011-01-13
      • 2014-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多