rest - 不保留已创建资源的 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)
解决方案
推荐阅读
- mysql - 如何改进 MySQL 表结构?
- python - 如何/是否可以关闭短路评估?
- travis-ci - 如果: env(STAGE_BUILD) = true 在 Travis 条件构建中不起作用
- java - Java - 使用多个布尔属性作为标志
- fortran - Fortran 检索边界外的矩阵值而不会出错
- javascript - 将数据传递给函数直到数组长度
- r - phylogeography:如何结合系统发育树和地理地图,并使用 gg* 包在提示和采样地点之间创建分段?
- ios - SwiftUI 将 UITableViewCell 包装成 UIViewRepresentable
- android - 如何在适配器之外重复适配器的功能?
- node.js - nginx proxy_pass 后面的节点 + Swagger