一尘不染

REST:通过一个请求更新多个资源-是标准的还是要避免的?

json

一个简单的REST API:

  • GET:items / {id}-返回具有给定id的商品的描述
  • PUT:items / {id}-使用给定的id更新或创建项目
  • DELETE:items / {id}-删除具有给定id的项目

现在要讨论的API扩展:

  • GET:item?filter-返回与过滤器匹配的所有项目ID
  • PUT:项目-更新或创建一组由JSON有效负载描述的项目
  • [[ DELETE:items-删除由JSON有效负载描述的项目列表 ]] <- 不正确

现在,我对DELETE和PUT操作回收功能感兴趣,可以通过PUT / DELETE项目/ {id}轻松访问该功能。

问题:提供这样的API是否常见?

备选方案:在单连接多个请求时代,发出多个请求很便宜,并且由于更改成功或失败而使原子请求工作起来更加原子化,但是在NOSQL数据库时代,即使请求处理终止,列表中的更改也可能已经发生。内部服务器或出于任何原因的任何原因。

[更新]

在考虑了白宫Web标准维基百科:REST示例之后,现在使用以下示例API:

一个简单的REST API:

  • GET:items / {id}-返回具有给定id的商品的描述
  • PUT:items / {id}-使用给定的id更新或创建项目
  • DELETE:items / {id}-删除具有给定id的项目

顶级资源API:

  • GET:item?filter-返回与过滤器匹配的所有项目ID
  • POST:项目-更新或创建一组由JSON有效负载描述的项目

不支持并且禁止在/ items上执行PUT和DELETE。

使用POST似乎可以解决问题,因为它是一种在封闭资源中创建新项目而不是替换而追加的方法。

HTTP语义POST读取:

通过追加操作扩展数据库

PUT方法需要替换完整的集合以便返回HTTP语义PUT引用的等效表示形式:

给定表示形式的成功PUT建议,在同一目标资源上进行后续GET将导致在200(OK)响应中返回等效表示形式。

[UPDATE2]

对于多个对象的更新方面而言似乎更加一致的替代方法似乎是PATCH方法。RFC
5789草案
中将PUT和PATCH之间的区别描述为:

PUT和PATCH请求之间的差异体现在服务器处理封闭实体以修改由Request-
URI标识的资源的方式。在PUT请求中,封闭的实体被视为原始服务器上存储的资源的修改版本,并且客户端正在请求替换存储的版本。但是,对于PATCH,封闭的实体包含一组指令,这些指令描述应如何修改当前驻留在源服务器上的资源以产生新版本。PATCH方法影响由Request-
URI标识的资源,并且可能对其他资源也有副作用。也就是说,可以通过应用PATCH来创建新资源或修改现有资源。

因此,与POST相比,PATCH可能也是一个更好的主意,因为PATCH允许进行UPDATE,因为POST仅允许附加一些意味着添加而无需修改的机会。

因此POST在这里似乎是错误的,我们需要将建议的API更改为:

一个简单的REST API:

  • GET:items / {id}-返回具有给定id的商品的描述
  • PUT:items / {id}-使用给定的id更新或创建项目
  • DELETE:items / {id}-删除具有给定id的项目

顶级资源API:

  • GET:item?filter-返回与过滤器匹配的所有项目ID
  • POST:项目-按照JSON有效负载的描述创建一个或多个项目
  • 修补程序:项目-按照JSON有效负载的描述创建或更新一个或多个项目

阅读 300

收藏
2020-07-27

共1个答案

一尘不染

您可以修补集合,例如

PATCH /items
[ { id: 1, name: 'foo' }, { id: 2, name: 'bar' } ]

从技术上讲,PATCH会在URL中标识记录(即PATCH /items/1而不是请求正文中的记录),但这似乎是一个实用的解决方案。

为了支持在单个调用中删除,创建和更新,标准REST约定实际上并没有对此提供支持。一种可能性是特殊的“批处理”服务,它使您可以将调用组合在一起:

POST /batch
[
  { method: 'POST', path: '/items', body: { title: 'foo' } },
  { method: 'DELETE', path: '/items/bar' }
]

它为每个嵌入式请求返回一个带有状态代码的响应:

[ 200, 403 ]

这不是真正的标准,但是我已经做到了并且可以正常工作。

2020-07-27