RESTful 到 return JSON + API 二进制文件的方法是什么

What is the RESTful way to return a JSON + binary file in an API

我必须实现一个接收开始和结束日期(以及其他参数)的 REST 端点。它会根据调用时期的服务器状态和输入数据进行一些计算以生成一种预测结果(想象一下接下来几天的天气预报)。 由于端点不会改变系统状态,我打算使用 GET 方法和 return a JSON.

问题是输出还包括一个图像文件(绘图)。所以我的想法是为文件创建一个唯一的 id 并在 JSON 响应中包含一个 URI 以供稍后使用(我认为这是 HATEOAS 原则建议的方式)。

我的问题是,由于这个图像文件是一种资源,它仅作为对原始端点的单次调用的响应的一部分有效,我需要一种方法在它被使用后将其删除。

是否会 RESTful 在通过 GET 服务后将其删除?

或仅通过删除公开它?

还是消费时不删除,保留一段时间? (无论如何都应该执行清除,因为我无法确保客户端使用该文件)。

我会很感激你的想法。

您可以在该二进制资源的 JSON 响应中提供下载 link,该二进制资源还包含生成该资源所需的参数。然后您可以自己决定何时清理该文件(管理磁盘 space)或缓存它 - 您始终可以重新生成它,因为您仍然拥有参数。我在这里假设生成不会花费大量时间。

这是一个棘手的问题。通常 GET 请求应该作为导入 HTTP 功能可重复,以防原始请求失败。有些人可能会依赖它。

它也可以解释为 'non-safe' 操作,GET 结果实际上是 DELETE

我倾向于在 X seconds/minutes 之后使图像过期,如果客户端得到结果并希望尽早清理,也许还支持 DELETE 在那个端点。

Would it be RESTful to deleting it after serving it via a GET?

是的。

or expose it only via a DELETE?

是的。

or not delete it on consumption and keep it for some time?

是的。

这些选项中的最后一个(缓存)非常适合 HTTP 中的 REST,因为我们有 meta-data 可以用来与通用组件通信,即给定表示具有有限的生命周期。

因此,报告的引用(包括 link 情节)可以附有 Expires header,告知客户报告的表述具有预期保质期。

因此,您可能计划在 10 分钟后对图像资源进行垃圾回收,如果客户端在此之前未获取它 - 噗,gone

您可能希望在将响应发送到 GET 后保留图像的原因:the network is unreliable,并且 GET 消息可能永远不会到达其目的地。将内容保存在缓存中可以节省您尝试重新计算图像的计算量。

如果你想确认客户端确实收到了数据,那么你必须在协议中引入另一条消息,让客户端通知图像已成功下载.

结合这些策略是合理的:安排自己在固定的时间内从缓存中逐出图像,但如果消费者确认收到则立即逐出图像。

但 REST 不对活性做出任何承诺 - 您可以向图像发送带有 link 的响应,但每次尝试获取它时都会返回 404 Not Found,这很好(不是 有用,当然,但很好)。 REST 不承诺资源具有稳定的表示,或者资源在某种程度上是永恒的。

REST 为我们提供了如何请求事物以及应如何解释响应的标准,但我们在选择适合任何给定请求的响应方面有很大的自由度。