首页 > 解决方案 > 不保留已创建资源的 REST API POST 端点

问题描述

我有一个 REST API,我想在其中添加一个运行算法并返回结果的端点。让我们假设算法足够快,可以同步完成。但是,结果可能很大。

选项 A

我将算法的结果视为“资源”。我可以实现以下

发布 /api/我的结果

这通过运行算法创建了一个新结果。算法的输入在请求正文中。响应包含结果的 id 或其他一些可识别的表示。

GET /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)

标签: restdjango-rest-frameworkapi-designrestful-url

解决方案


推荐阅读