首页 > 解决方案 > REST API - 是否允许对 POST 和 PUT/PATCH 使用不同的表示?

问题描述

假设我有一个处理 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。

标签: jsonrest

解决方案


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

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

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

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

无论如何,这是一个最佳实践,但不是硬性建议。如果 和 的表示PUT不同,GET 会期待不同的 mimetype。


推荐阅读