RESTAPI和提供二进制资源

RESTAPI和提供二进制资源,rest,Rest,使用RESTAPI交付二进制资源(如pdf文件)的约定是什么?您是否只是在JSON或XML响应中返回资源的URL,例如,{“URL”:http://example.com/document.pdf"} ? 我试图理解URI和URL之间的区别,并遵循RESTful的理念。诚然,这对我来说是新的,所以我可能会误解一些事情 根据我的经验,这样做与REST Web服务的想法背道而驰。与传统的RESTful服务不同,您永远无法缓存此响应而不感到严重头痛。此外,由于您必须以文本形式使用服务才能读取XML/

使用RESTAPI交付二进制资源(如pdf文件)的约定是什么?您是否只是在JSON或XML响应中返回资源的URL,例如,{“URL”:http://example.com/document.pdf"} ?


我试图理解URI和URL之间的区别,并遵循RESTful的理念。诚然,这对我来说是新的,所以我可能会误解一些事情

根据我的经验,这样做与REST Web服务的想法背道而驰。与传统的RESTful服务不同,您永远无法缓存此响应而不感到严重头痛。此外,由于您必须以文本形式使用服务才能读取XML/JSON,因此您可能无法同时优化文本和二进制读取。更不用说,您必须始终需要二进制信息,否则当您只需要文本数据时,您的性能会受到相当大的影响。如果您总是需要二进制数据,也许会问自己为什么需要Web服务

这并不是说这是不可能的(毕竟存在BSON),或者这方面的用例不存在,但您应该确保在尝试这样做之前,您不能不强制单独请求二进制数据。将二进制数据嵌入为文本设计的文档格式是非常低效的,并且这种格式的数据将比原始字节大得多

另一方面,如果您总是使用SVG或某些类型的PDF等矢量图形资源进行此操作,则可以将其表示为XML数据。同样,您可能不想这样做,因为这会增加您的有效负载,但这是一个绕过“需要二进制”的选项。

本节假设您的意思是:如何告诉用户在哪里可以找到二进制资源 URI和URL之间的区别与二进制和非二进制数据类型()无关

如果您返回的大部分是JSON,那么
url
条目是一种常见的方式。如果您正在做一些HTML/XML格式的工作,那么像
元素这样具有良好的
rel
属性就很有意义了

显然,如果客户机向您提供给他们的直接URL发出
GET
请求,那么您应该向他们发送文件,除非他们发送了一堆内容协商头,这些头实际上阻止了您满足他们的请求。在这种情况下,回答(或)很有意义

如果你的问题是指其他问题,请澄清

漫无边际的“像这样做”部分 第一:忽略URL和URI。这与此无关。一点也不

下一步:如果您的问题不是“如何链接到资源”(这可能会受到我将要讨论的内容的影响),而是“如果我的资源只是一个PDF文件怎么办”,那么您有各种各样的选项来解决它。首先,你需要退一步,更抽象地思考(一点)。您的资源几乎肯定不是“PDF文件”。它是“用户上传的文件”,或“我生成的报告的PDF版本”,等等

在第一种情况下,除了他们发送给您的二进制文件之外,您可能没有任何资源表示,这是完全正确的。当您收到指向该资源URL的
GET
时,可能不需要执行任何类型的内容协商。只需将文件发送给他们,并遵守我上面提到的关于
406
的注意事项

在第二种情况下,您可能拥有此资源的各种表示形式:CSV、HTML、LaTeX,您可以随意选择。在这种情况下,当您收到一个到资源URL的
GET
时,您确实需要进行一些内容协商,以便您知道是向他们发送PDF文档还是其他内容。您可能拥有资源的JSON表示,它只是用于生成PDF的原始数据

在这两种情况下,如果您有一个严格基于资源元数据的表示,这将是意外的。如果需要(通常是,有时不是),显式的外部元数据(与嵌入在二进制资源中的元数据相反,如PDF中的作者和标题信息)通常被建模为单独的资源


最后,正如@monitorjbl所说:您可能不希望直接将二进制数据嵌入到文本格式中,如JSON或XML。有很多方法可以做到这一点,通常使用“base64编码”这个词,但这通常不是最好的方法。一般来说,您不应该混合使用二进制数据和文本数据。

无论是否为二进制数据,您的REST资源都应该使用超媒体类型进行描述

  • 如果您的REST客户端以msgpack格式放置/发布资源,REST服务器仍然可以读取此消息并更新/创建资源。那为什么不呢
  • 如果您的REST客户端以PDF格式放置/发布资源,我猜您将无法提取正确创建/更新资源所需的所有信息。所以,不
在最后一种情况下,您可能正在处理一个类似“Google drive”的服务:这些PDF本身不是您的资源,应该由您的实际资源链接(即URL应该在您的资源中)


即使GoogleDrive可能不是完美的RESTAPI,但它同时处理JSON资源和实际的二进制文件

这就是我的意思。当GET请求到来时,我可以直接吐出pdf文件,但这似乎不是RESTful。我假设您应该只返回资源的“表示”,而不是资源本身(同样,我可能误解了这里的某些内容)。这就是为什么我对URI和URL有点困惑的原因。您的链接很有帮助,但我仍在努力澄清。@Drinian我更新了我的答案;希望它现在更有用。谢谢。pdf有一个数据表示形式,即发票,但pdf有唯一的数据(签名)。我假设这意味着最好的解决方案就是发回一个指向pdf的URL?如果