当前位置: 首页 > 面试题库 >

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

诸葛利
2023-03-14
问题内容

一个简单的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有效负载的描述创建或更新一个或多个项目

问题答案:

您可以修补集合,例如

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 ]

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



 类似资料:
  • 一个简单的REST API: get:items/{id}-返回具有给定id的项的说明 put:items/{id}-更新或创建具有给定id的项目 删除:items/{id}-删除具有给定id的项目 null 问题:提供这样的API是常见的吗? 备选方案:在单连接的时代,多个请求发出多个请求是便宜的,而且工作起来更加原子化,因为一个更改要么成功要么失败,但是在NOSQL数据库的时代,列表中的更改可

  • 还是使用现有endpoint更好?使用现有endpoint的一个问题是,驱动程序有很多字段(几乎30个),发送所有这些字段只是为了更新“启用”或“禁用”驱动程序是一些过分的东西。 你觉得呢?

  • 问题内容: 对于我的工作,我必须开发一个小型Java应用程序,该应用程序可以解析非常大的XML文件(约30万行)以选择非常具体的数据(使用),因此我试图对其进行一些优化。我想知道这两个摘要之间哪个更好: 要么 其他详情: 这些if语句在循环内的每次迭代中执行(约20k次迭代) 的是一种在利用外部函数每次迭代计算 如果将设置为,则无需测试正则表达式是否匹配 谢谢你的帮助。 问题答案: 我遵循的一条黄

  • 在构建Kafka Streams拓扑时,可以通过两种不同的方式对多个主题的读取进行建模: 读取具有相同源节点的所有主题。 选项1相对于选项2是否有相对优势,反之亦然?所有主题都包含相同类型的数据,并具有相同的数据处理逻辑。

  • 在Jersey 2中,我试图开发一种方法,它允许传递一对JSON列表(服务、方法),这些列表表示REST请求中对资源的访问路径,并将结果聚合到单个响应中。因此,JSON列表可以如下所示: 相应的命令bean可以如下所示: 我找到了这个主题,但它似乎适用于Jersey的版本1:如何在单个请求中访问多个资源:Jersey Rest 谢谢你的回答,为我糟糕的英语感到抱歉。

  • 我正在更新APIendpoint中的数据。正如我所说,我使用表单请求验证将验证与控制器分开。 这适用于存储请求。 但是,当我试图更新下面提到的单个数据时,响应返回以下响应数据。 因为,数据已经存储在数据库中。当我发送更新数据的请求时...应该返回更新的数据。但是,它不返回。 需要帮助来解决这个问题。 正文中的JSON数据: 当前响应: 问题要求: 更新: