我不同意@Opal 在这里的回答,因此我发布了这个回答。我确实觉得您使用错误的工具(或术语)来实现您想要的。 REST 不仅仅是通过设计简洁的 URI 进行的 HTTP 调用。正如@Opal 在对他的回答的评论中提出的那样,WebSockets 可能是您正在寻找的东西,尽管 REST 也可能能够满足您的需求(就像普通的 HTTP 一样)。
暂停视频
停止视频不应该是 HTTP 服务器的任务,而是客户端的任务。通常partial GET requests 被发送到服务器,只检索资源的一部分并将它们添加到客户端读取的缓冲区中。在后面,客户端站点将发出进一步的部分请求,以在客户端读取缓冲区时保持缓冲区填充。如果客户端想要暂停,它只是停止读取缓冲区并选择性地停止向服务器发送进一步的部分 GET 请求。
这允许将实际视频传播到多个服务器上,让客户端与这些服务器中的任何一个进行对话,并且仍然可以获得正确的响应。如果服务器必须维护客户端状态,则需要确保该状态也复制到所有其他服务节点。当然,这是可能的,但也会带来更高的开销!
更新视频
当您显然创建了一个视频编辑系统时,您在这里有两个选项,PUT definiton 也建议:
通过定位一个单独标识的资源,其状态与较大资源的一部分重叠,或者使用专门为部分更新定义的不同方法(例如,@987654323 中定义的 PATCH 方法),可以实现部分内容更新@)。
- 将资源分成更小的资源
- 使用其他方法,例如
PATCH
正如@Opal 在他的回答中已经指出的那样,如果您使用PATCH 部分更新资源,您不仅应该在正文中提供新内容,还应该指示服务器应该如何处理它。
不过,对于视频编辑系统来说,将资源分离为更小的资源对我来说确实更自然。视频可以看作是一系列场景,其中包含大量图片,可能还有附加的声音文件。
因此可以在伪 Json-HAL 中像这样表示电影:
Movie : {
title: The Matrix,
release_year: 1999,
actors: [Keanu Reeves, Laurence Fishburne, Carrie-Anne Moss, Hugo Weaving, Joe Pantoliano],
...
link: {
self: http://...,
...
},
embedded: {
Scenes : [
{
description: Trinity chased by police,
links: [
self: http://...,
video: http://.../scene01.vid
]
},
{
description: Thomas Anderson get notified to follow the white rabbit,
start_offset: 5091,
end_offset: 193920,
links: [
self: http://...,
video: http://.../scene02.vid
]
},
...
]
}
}
您可以单独维护每个场景,而不是将所有字节放在一个文件中。如果从场景 1 播放到场景 n,电影表示会将场景组合成完整的电影。
如果现在编辑了一个场景并且应该替换整个场景文件,则使用简单的 PUT 请求就足够了。如果您想修剪视频的前几秒或最后几秒,您可以为各个场景引入开始和停止偏移,而不是再次重新上传整个场景,而是告诉客户它应该从建议的节日开始或停止在建议的位置。
客户端可以在部分 GET 请求中使用此参数来仅检索必要的字节。然后当然应该通过 PATCH 命令修改此字段,以防止更改视频字节或其 URI。为了让客户端了解视频的总字节数,它可以首先向 URI 发出 HEAD 请求并使用从响应返回的内容长度
当然,这需要它自己的媒体类型,但这就是 REST 的真正意义所在。我不知道为什么这么多人滥用 REST 术语来表示普通的 URI 设计,或者认为当 REST 实际上并不关心 URI 布局时,一个简洁的 URI-API 更 RESTful。