【问题标题】:REST API - Is it allowed to use different representations for POST and PUT/PATCH?REST API - 是否允许对 POST 和 PUT/PATCH 使用不同的表示?
【发布时间】:2021-05-27 19:57:13
【问题描述】:

假设我有一个处理 POST 请求的函数,它对 POST 请求采用以下表示:

'
{
  "name": "name",
  "nestedObject": {
    "prop1": "v1",
    "prop2": "v2"
  }
}
'
它创建具有给定名称的新对象,并使用 props 为它创建嵌套对象:prop1 和 prop2。

但是,对于 PUT/PATCH 请求,我更方便的是使用(已经存在的)对象的 URL 使其成为顶级对象的嵌套对象,而不是传递其数据,如下所示:

'
{
  "name": "updatedName",
  "nestedObject": "http://alreadyExistingObjectUrl"
}
'
另一方面,GET 将返回嵌套对象数据,而不是其 URL:

'
{
  "name": "name",
  "nestedObject": {
    "prop1": "v1",
    "prop2": "v2"
  }
}
'

为不同的方法使用不同的资源表示是否是一种好习惯? POST 获取嵌套对象数据并创建它,PUT/PATCH 仅获取已经存在的对象 url 并使该对象嵌套在父对象中。 GET 返回嵌套对象数据,而不是 URL。

【问题讨论】:

  • 如果你打算对不同的动作使用不同的表示,最好不要重载特定键的含义。也就是说,如果在 PUT 的情况下,"nestedObject" 将引用一个 url,请考虑将其重命名为 "nestedObjectUrl" 以避免混淆。
  • 但是通常允许或应该避免对不同的操作使用不同的表示?
  • REST 不是一个超级严格的定义,但我同意@Evert 的回答,即能够通过使用您收到的相同对象发出PUT 请求来更新您的对象真是太好了GET 请求。

标签: json rest


【解决方案1】:

如果您需要不同的格式,最好为每种格式定义特定的 mimetype。

一般来说,允许用户执行以下操作是一个非常好的设计属性:

foo = resource.get();
foo.name = 'new name';
resource.put(foo);

基本上,如果我可以假设GET 返回的格式可以在PUT 请求中重复使用,这也意味着服务器可以添加新的必需属性,这仍然有效。

无论如何,这是最佳做法,但不是硬性建议。如果PUTGET 的表示不同,我会期待不同的mimetype。

【讨论】:

  • 基本上我希望 PUT/PATCH 采用嵌套对象 URL 表示,并 GET 返回嵌套对象数据。所以这不是正确的方法。谢谢。
猜你喜欢
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多