通过REST(RESTful)API批量收集操作
我想在devise一个REST API的build议,这将允许客户端高效地添加/删除大量的对象集合。
通过API,客户需要能够将项目添加到collections中,并从中删除项目以及操作现有项目。 在许多情况下,客户将要对集合进行批量更新,例如添加1000个项目并删除500个不同的项目。 感觉像客户端应该能够在与服务器的单个事务中执行此操作,而不是要求1000个单独的POST请求和500个DELETE。
有没有人有关于实现这一目标的最佳做法或惯例的任何信息?
我目前的想法是,应该能够代表对收集URI的变化的对象,但这似乎与HTTP 1.1 RFC不一致,这似乎表明,在PUT请求中发送的数据应该独立于数据已经存在于URI中。 这意味着客户必须一次性发送一个完整的集合状态描述,这个描述可能比变化要大得多,甚至比客户提出请求时要多。
显然,如果有必要,我会很乐意偏离RFC,但是如果存在这样的惯例,则希望以传统的方式进行。
您可能想将更改任务视为资源本身。 所以你真的把一个单一的对象,这是一个批量数据更新对象。 也许它有一个名字,所有者和CSV,XML等大块需要parsing和执行。 在CSV的情况下,您可能还需要确定CSV数据中表示的对象types。
列出作业,添加作业,查看作业状态,更新作业(可能是为了启动/停止作业),删除作业(如果正在运行则停止作业)等。这些操作可轻松映射到REST APIdevise。
一旦你有了这个,你可以轻松地添加批量数据更新器可以处理的不同数据types,甚至可以在同一个任务中混合在一起。 换句话说,没有必要将这个相同的API复制到你想导入的每种types的应用程序中。
这也非常容易实现后台任务。 在这种情况下,您可能希望将字段添加到单个任务对象,以允许API客户端指定他们希望如何通知(他们希望您完成GET时的GET或发送电子邮件等) 。
是的,PUT创build/覆盖,但不会部分更新。
如果您需要部分更新语义,请使用PATCH。 请参阅http://greenbytes.de/tech/webdav/draft-dusseault-http-patch-14.html 。
你应该使用AtomPub 。 它是专门为通过HTTPpipe理集合而devise的。 甚至可能会有一个select语言的实现。
至less对于POST来说,似乎应该能够POST到列表URL,并且请求的主体包含新资源的列表,而不是单个新资源。
据我了解,REST意味着重新表示状态转移,所以你应该将状态从客户机转移到服务器。
如果这意味着太多的数据来回,也许你需要改变你的表示。 一个collectionChange结构可以工作,并通过一系列的删除操作(通过id)和附加操作(带有完整的xml表示forms),发送到一个处理接口的URL。 接口实现可以select自己的方法来删除和添加服务器端。
最纯粹的版本可能是通过URL定义项目,而集合包含一系列的URL。 新的集合可以在客户端更改后进行PUT,然后是一系列添加项目的PUT,如果要实际从服务器删除项目,而不是将其从列表中删除,可能需要执行一系列删除操作。
您可以引入现有集合元素的元表示,这些元素不需要传输整个状态,因此在某些抽象代码中,更新可能如下所示:
{现有元素1-100} {新元素foo值“bar”,“baz”} {现有元素105} {新的元素foobar值“bar”,“foo”} {现有元素110-200}
添加(和修改)元素是通过定义它们的值来完成的,删除元素是通过不提及新的集合和重新sorting元素是通过指定新的顺序(如果顺序是根本存储的)完成的。
通过这种方式,您可以轻松地呈现整个新集合,而无需重新传输整个内容。 使用If-Unmodified-Since
标头可确保您对内容的想法确实与服务器想法相匹配(这样您就不会意外删除提交请求时根本不知道的元素)。