从REST接口返回应用程序/八位字节流可以吗?

从REST接口返回应用程序/八位字节流可以吗?,rest,web-applications,mime-types,Rest,Web Applications,Mime Types,通过返回应用程序/八位字节流以获取响应,我是否违反了REST圣经中的任何法律?REST端点接收5个图像URL { "image1": "http://ww.o.com/1.gif", "image2": "http://www.foo.be/2.gif" } 它将下载这些文件并将其作为应用程序/八位字节流返回 澄清:调用此REST界面的客户端是一个移动应用程序。每增加一次网络连接,电池寿命就会减少几毫安。我被迫使用REST,因为这是公司的标准。如果没有,我将使用我自己的二进制协议。它不是很

通过返回应用程序/八位字节流以获取响应,我是否违反了REST圣经中的任何法律?REST端点接收5个图像URL

{ "image1": "http://ww.o.com/1.gif",
  "image2": "http://www.foo.be/2.gif" }
它将下载这些文件并将其作为应用程序/八位字节流返回


澄清:调用此REST界面的客户端是一个移动应用程序。每增加一次网络连接,电池寿命就会减少几毫安。我被迫使用REST,因为这是公司的标准。如果没有,我将使用我自己的二进制协议。

它不是很好,因为客户端将不知道如何处理这些二进制数据,除非将这些字节存储在某个位置或将它们发送到其他进程(如果这是您对数据所需的全部操作,那么就可以了)


您可以查看内容类型。依我看,包含多个
image/gif
部分的多部分消息是更好的选择。

为什么不进行五次单独的REST调用


看起来更干净,划分更合理。它还将并行运行下载,根据您使用的浏览器,每次可运行2次或更多下载。

听上去,这更像是一个RPC调用。具体来说,“这是一个URL列表,给我发一个存档”

这个过程不是特别RESTful的,因为REST不是基于RPC的系统

您需要做的是将归档文件视为资源,并找到一种创建和提供归档文件的方法

例如,您可以:

POST /archives
Content-Type: application/json

{ "image1": "http://ww.o.com/1.gif",
  "image2": "http://www.foo.be/2.gif" }
因此,您将获得

HTTP/1.1 201 Created
Location: http://example.com/archives/1234
Content-Type: application/json
然后,您可以请求:

在这里,您将在一个请求中获得实际的存档(如您所希望的),只是它是一个多部分格式的结果。(multipart/x-zip也可以,这是一个zip文件)

如果您这样做了:

GET /archives/1234
Accept: application/json
您将获得最初发送的JSON(因此,您可能可以编辑和更新存档,这可能是您不希望支持发送二进制图像的内容)

要更改它,只需将更新发回:

PUT /archives/1234
Content-Type: application/json

{ "image1": "http://ww.o.com/1.gif",
  "image2": "http://www.foo.be/2.gif",
  "image3": "http://www.foo2.foo/4.gif" }
资源名为/archives/1234

在本例中,它有两种表示形式:JSON版本和实际的二进制存档。您的服务使用Accept标头中指定的内容类型来区分两者。该标题是客户机告诉您它想要什么

完成归档后,只需将其删除即可

DELETE /archives/1234

或者,您可以让服务器在稍后某个时间使资源过期。

它们被称为REST原则而不是法律,但我认为,不,您没有“违反”它们。REST是指资源可以通过URL寻址,并且(在适当的情况下)可以以多种格式提供。它没有说明格式应该是什么。关于REST的含义有一个简单的描述

然而,正如@Andrey所说,有比发明自己的临时格式更好的方法来处理发送多个数据对象。多部分mimeType/格式是一种替代方法,另一种方法是将对象打包为tar、zip或类似的归档文件格式发送


使用“应用程序/八位字节流”的真正问题是,它不会告诉任何人数据的实际格式。相反,您的客户机“知道”它是如何格式化的,并相应地解释它。发明自己的格式的问题是互操作性,并且(可能)必须设计、实现和维护库来支持它,可能会多次出现。

可能确实存在
n
URL,并且使用HTTP req/resp对每个图像进行迭代可能会很昂贵。如果每个请求实际上只有几个链接,那么通过提供单个图像,事情就变得更简单了。除了n值非常大的情况外,将它们打包在一起并不是非常RESTful的。如果n非常大,也许另一种策略更有意义。客户端不是浏览器,而是本地移动应用程序。如前所述,问题不在于负载,而在于内容类型。理想情况下,内容类型尽可能地描述数据。多部分在这里更合适。它还允许您混合图像(例如,组合PNG和JPG)。而且成本是新元数据的最小开销。您没有混淆
PUT
POST
PUT
通常用于更新资源,如
/archives/1234
,而
POST
则用于创建新事物,如您的示例中的新存档:
POST/archives
DELETE /archives/1234