2014-04-25 149 views
1

是否有通过REST为POST,PUT,PATCH动词执行BATCH操作的最佳实践?通过REST服务批处理

我下面当前范例是,JSON有效载荷在所述主体中指定的所有3个操作

一个)POST返回创建的资源
B的位置)PUT/PATCH返回201,如果更新成功

对于批处理操作,我打算接受有效内容主体中的json对象的集合,但正试图确定要返回给客户端的内容。 在处理批处理时,操作可能会成功执行某些项目,但可能会失败。

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

但是,这偏离了上面(a)和(b)中概述的范例。

相反,它是否有意义将代表批处理操作本身的ID的标识符返回给客户端?

然后客户端会发出一个后续的GET来获取它所请求的操作的结果。

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

想法/想法/建议?

由于REST是一种体系结构风格,不一定有明确的“准则”,并且没有关于如何实现HTTP动作的操作的要求,所以显然这里没有正确或错误的答案。

我在寻找优雅,自然,直观的解决方案。

+0

REST不是“指南”。这是一种建筑风格。 –

+0

每个资源是否需要批处理操作,或者只有一个? –

+0

你能更具体地了解你的任务吗? – inf3rno

回答

1

REST是一种建筑风格。

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

根据批量大小,我将返回处理内容的数组,或者处理内容的标识符数组。

如果批处理操作是长时间运行的返回标识批次,但要明确痛苦的终点是从其他端点

前夫不一样。如果您通过张贴到 http://somesite.com/users

发送一批请求 http://somesite.com/batch/users

上创建一个用户得到返回批量操作的状态,同时它仍在运行,在完成返回记录的数组被更新的。

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

+1

REST是*不是“指南”。这是一种建筑风格。 –

+0

同意,我会更新我的回答 – Leon

2

从外部看,REST操作应该是原子的。也就是说,如果请求的一部分失败,那么服务器的整个状态应该恢复到预先请求状态,并返回一个4xx或5xx响应(例如,如果请求可以重复,整个过程没有不良影响,如果它第一次失败了)。然而,这与批量操作本身无关 - 这样的请求可能是任何类型的请求。

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

如果您想要执行批处理操作,请放弃尝试调用您的API RESTful,因为您已经失去了REST赋予的好处,并且只是对自己说谎。

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

+0

创建一个幂等的批处理操作很容易通过实现来解决。至于没有调用API RESTful,因为批处理操作似乎过于实用。您只需要对正在创建的资源进行不同的思考,在这种情况下,新资源就是批量操作。 – Leon

+1

@Leon如果您在/ batch-ops/12处创建资源,并且可以查询该资源以获取操作的当前状态,那么是的,这是RESTful。如果你只是发布到/ batch/make-new-users,那么不是,它不是REST,而是RPC。 –