通过REST服务进行批处理

通过REST服务进行批处理,rest,restapi,Rest,Restapi,通过REST for POST、PUT和PATCH谓词执行批处理操作是否有最佳实践 我遵循的当前范例是,在主体中为所有3个操作指定JSON负载: a) POST返回已创建资源的位置 b) 如果更新成功,则PUT/PATCH返回201 对于批处理操作,我打算在有效负载主体中接受JSON对象的集合,但我正试图找出返回给客户机的内容 处理批处理时,某些项目的操作可能会成功,但其他项目的操作可能会失败 考虑到这一点,我认为最好的做法是返回一组对象,指示有效负载中每个项目的成功/失败状态 但这与我在上文(

通过REST for POST、PUT和PATCH谓词执行批处理操作是否有最佳实践

我遵循的当前范例是,在主体中为所有3个操作指定JSON负载:

a) POST返回已创建资源的位置
b) 如果更新成功,则PUT/PATCH返回201

对于批处理操作,我打算在有效负载主体中接受JSON对象的集合,但我正试图找出返回给客户机的内容

处理批处理时,某些项目的操作可能会成功,但其他项目的操作可能会失败

考虑到这一点,我认为最好的做法是返回一组对象,指示有效负载中每个项目的成功/失败状态

但这与我在上文(a)和(b)中概述的范例不同

相反,将表示批处理操作本身ID的标识符返回给客户端有意义吗

然后,客户机将发出后续GET以获取其请求的操作的结果

这种方法听起来合理吗?如果是这样,如果操作尚未完成,在后续GET上阻止客户端是否有意义,或者始终返回最新状态是否有意义,即客户端请求处理的每个项目的响应集合

想法/想法/建议

因为REST是一种架构风格,没有必要明确的“指导原则”,也没有 关于如何实现HTTP谓词操作的命令,这里显然没有正确或错误的答案


我正在寻找一种优雅、自然和直观的解决方案。

REST是一种建筑风格

我实现API以始终返回更新的结果。因此,在POST的情况下,它将返回创建的实体,而PATCH和PUT将返回更新的实体

根据批量大小,我要么返回处理内容的数组,要么返回处理内容的标识符数组

如果批处理操作是长时间运行的,则返回批处理的标识符,但必须清楚地表明该端点与其他端点不同

例如,如果您通过发布到创建用户

将批处理请求发送到

get返回批处理操作仍在运行时的状态,complete返回已更新的记录数组


最重要的是一致性,无论您选择什么,在整个系统中始终遵循批处理操作的相同方法。

从外部看,REST操作应该是原子的。也就是说,如果请求的一部分失败,则服务器的整个状态应恢复为请求前状态,并返回4xx或5xx响应(因此,例如,如果请求第一次失败,则可以完整地重复请求而不会产生不良影响)。然而,这与批处理操作本身无关,这样的请求可以是任何类型的请求

批处理操作违反了不同的REST约束,即统一接口的REST约束(由HTTP方法及其对指定URL上的资源的操作定义)

如果您想执行批处理操作,请放弃尝试调用您的API RESTful,因为您已经失去了REST所带来的好处,这只是在欺骗自己


如果您想保留这些优势,请放弃批量操作。

REST不是“指南”。这是一种体系结构风格。是每个资源都需要批处理操作,还是只有一个?你能更具体地说明你的任务吗?@Eric:我同意REST是一种体系结构风格。在本文中使用“guideline”一词主要是因为我看到了HTTP谓词的操作如何实现的各种实现。例如,对于如何处理接受阵列的修补程序操作,没有明确的答案。您应该返回结果的集合还是返回单个结果?如果某些操作成功了,那么说批处理失败是令人困惑的。您将如何指示哪些项已成功处理?@AbhijeetPatel来自RFC 5789第2节第6段:“服务器必须以原子方式应用整个更改集[…]”还有RFC 6902,用于处理数组的修补程序的JSON格式。REST不是“指南”。这是一种体系结构风格。创建幂等的批处理操作很容易通过实现来解决。至于不调用API RESTful,因为有一个批处理操作似乎过于实用。您只需要对正在创建的资源进行不同的思考,在本例中,新资源是一个批处理操作。@Leon如果您在/batch ops/12“创建”一个资源,并且可以查询该资源以获取操作的当前状态,则是的,这是RESTful。如果您只是发布到/batch/makenewusers,那么不,这不是REST,而是RPC。