我有一个REST API,我想在其中添加一个运行算法并返回结果的端点。我们假设算法足够快,可以同步完成。但是,结果可能会很大。
选项A
我将算法的结果视为“资源”。我可以实现以下
POST / api / my-result
这通过运行算法来创建新结果。该算法的输入位于请求正文中。响应包含结果的ID或其他可识别的表示形式。
获取/ api / my-result //?view = table
这允许客户端获取结果的表表示。同样,可能会有其他视图,过滤器等可以用相同的方式实现。
但是,这需要我将结果保存在数据库中。有两个问题:(a)结果可能很大,并且(b)客户端在决定“保留”其中一个结果之前,经常使用不同的输入多次运行该算法-因此,理想情况下,我只想存储最终结果在数据库中。
选项B
POST / api / my-algorithm / 这将在请求正文中接受算法的参数,并将结果返回到响应正文中
POST / api / my-result-table-view 这将在请求正文中接受结果,并返回将结果的表示形式转换为表视图的响应。之所以不是GET / api / my-result //?view = table,是因为客户端需要能够在未持久的结果上调用它。 “结果的表格视图”是在此处创建的资源。
类似地,我可以将结果的每个视图实现为单独的端点。
POST / api / my-result 这将创建一个新结果(无需运行算法)。例如,如果结果是图像,则此POST请求可以接受图像作为文件上传并简单地存储它。客户端反复调用POST / api / my-algorithm /,对结果满意后,便调用此端点创建结果。
我相信选项A是更“ RESTful”的方式,但是保留所有结果的开销。
您推荐哪种选择?选项B是否可以以其他方式实现以使其更“ RESTful”?有没有一种方法可以创建资源而不实际将其持久保存在数据库中(也许在缓存中)?如果您提出缓存路线,请提供更多说明,因为我不知道如何实现。
(如果相关,我正在使用DRF来实现API)