stream式资源如何适应REST风格?
使用RESTful服务,您可以创build,读取,更新和删除资源。 当你处理类似于数据库资产的东西时,这一切都很有效 – 但是这怎么转化为stream式数据呢? (或者呢?)例如,在video的情况下,将每个帧视为我应该一次查询的资源似乎是愚蠢的。 相反,我会build立一个套接字连接和stream一系列的帧。 但是这是否打破了REST风格? 如果我想能够快退或快进stream呢? 这是可能的RESTful范式内? 那么: stream式资源如何适应REST风格呢?
作为一个实施的问题,我正在准备创build这样的stream媒体数据服务,我想确保我是做“最好的方式”。 我相信这个问题之前已经解决了。 有人能指点我的好材料吗?
我没有find有关真正的RESTfulstream媒体的资料 – 看起来结果主要是关于将stream式传输委托给另一个服务(这不是一个糟糕的解决scheme)。 所以我会尽我所能来解决它自己 – 请注意stream媒体不是我的领域,但我会尝试添加我的2美分。
在stream媒体方面,我认为我们需要把问题分成两个独立的部分:
- 访问媒体资源(元数据)
- 访问媒体/stream本身(二进制数据)
1.)访问媒体资源
这是非常简单的,可以以干净和RESTful的方式处理。 举一个例子,假设我们将有一个基于XML的API,它允许我们访问一个stream列表:
GET /media/ <?xml version="1.0" encoding="UTF-8" ?> <media-list uri="/media"> <media uri="/media/1" /> <media uri="/media/2" /> ... </media-list>
…也适用于各个stream:
GET /media/1 <?xml version="1.0" encoding="UTF-8" ?> <media uri="/media/1"> <id>1</id> <title>Some video</title> <stream>rtsp://example.com/media/1.3gp</stream> </media>
2.)访问媒体/stream本身
这是更有问题的一点。 你已经指出了你的问题中的一个选项,那就是允许通过RESTful API单独访问框架。 即使这可能起作用,我同意你这不是一个可行的select。
我认为可以有以下select:
- 通过专门的stream媒体协议(如RTSP)将stream媒体委托给专用服务,
- 利用HTTP中的可用选项
我相信前者是更高效的select,尽pipe它需要专用的stream服务 (和/或硬件)。 这可能是在RESTful的边缘,但请注意,我们的API在所有方面都是RESTful的,即使专用stream服务不遵守统一接口(GET / POST / PUT / DELETE),我们的API确实。 我们的API允许我们通过GET / POST / PUT / DELETE对资源及其元数据进行适当的控制,并且提供到stream服务的链接(从而遵循REST的连通性方面)。
后一种select – 通过HTTPstream式传输 – 可能不如上述那样高效,但这绝对是可能的。 从技术上讲,与通过HTTP访问任何forms的二进制内容没有什么不同。 在这种情况下,我们的API将提供一个到可通过HTTP访问的二进制资源的链接,同时也向我们介绍资源的大小:
GET /media/1 <?xml version="1.0" encoding="UTF-8" ?> <media uri="/media/1"> <id>1</id> <title>Some video</title> <bytes>1048576</bytes> <stream>/media/1.3gp</stream> </media>
客户端可以使用GET /media/1.3gp
通过HTTP访问资源。 一个选项是客户端下载整个资源 – HTTP渐进式下载 。 一个更清洁的替代scheme是让客户端通过使用HTTP Range头来访问资源块。 为了获取大小为1MB的文件的第二个256KB块,客户端请求将如下所示:
GET /media/1.3gp ... Range: bytes=131072-262143 ...
一个支持范围的服务器然后回应Content-Range头 ,接着是资源的部分表示:
HTTP/1.1 206 Partial content ... Content-Range: bytes 131072-262143/1048576 Content-Length: 1048576 ...
请注意,我们的API已经以字节(1MB)告诉客户端文件的确切大小。 在客户端不知道资源大小的情况下,它应该首先调用HEAD /media/1.3gp
来确定大小,否则会冒服务器响应416 Requested Range Not Satisfiable
。