我正在开发2个REST API,它可以在我的后端编辑和暂停一些东西。 对于我正在使用的编辑:
PUT /video/1
开发暂停视频服务的最佳方式是什么。我应该使用PATCH
或PUT
吗?输入只是id。如果我使用PUT
那么如何区分编辑和暂停?如果我有另外一个API要开发用于例如:视频重启,我如何在REST API中容纳这些动词?
答案 0 :(得分:3)
使用HTTP方法区分状态只是一个糟糕的想法。你能做的是:
介绍state
,然后使用PATCH
更改状态:
PATCH /vidoes/1
{
"state": "PLAYING|PAUSED|STOPPED" // what you need here
}
心灵don't patch like an idiot,然而像傻瓜一样修补是很常见的。
引入将反映在资源上调用的操作的新端点 - 这不是完全RESTful,但也很常见:
POST /vidoes/1/play/
POST /vidoes/1/stop/
POST /vidoes/1/pause/
PUT
当然可以,但请记住PUT
是幂等的并且需要发送资源。
答案 1 :(得分:2)
我不同意@Opal在这里的答案,因此我发布了这个答案。我觉得你使用错误的工具(或术语)来实现你想要的东西。 REST不仅仅是通过设计干净的URI进行HTTP调用。正如@Opal在回答他的回答时提出的那样,WebSockets可能就是你想要的,虽然REST也可以满足你的需求(正如HTTP那样)。
HTTP服务器的任务不应该是停止视频而是客户端。通常partial GET requests被发送到服务器,仅检索资源的一部分并将它们添加到客户端读取的缓冲区中。在后面,客户端站点将发出进一步的部分请求,以便在客户端读取缓冲区时保持缓冲区已填满。如果客户端想要暂停,它只是停止读取缓冲区,并可选择停止向服务器发送进一步的部分GET请求。
这允许将实际视频传播到多个服务器上,让客户端与其中任何一个进行通信,并且仍能获得正确的响应。如果服务器必须维护客户端状态,则需要确保该状态也复制到所有其他服务节点。当然,这是可能的,但也加上更高的开销!
当你明显创建一个视频编辑系统时,这里有两个选项,PUT definiton建议:
通过将具有与较大资源的一部分重叠的状态的单独标识的资源定向,或者通过使用为部分更新专门定义的不同方法(例如,{{中定义的PATCH方法),可以实现部分内容更新。 3}})。
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请求就足够了。如果你想修剪视频中的第一个或最后几秒,你可以为相应的场景引入开始和停止偏移,而不是再次重新上载整个场景,你告诉客户它应该从建议的offest开始或停止在建议的位置。
客户端可以在部分GET请求中使用此参数来仅检索必要的字节。当然,应该通过PATCH命令修改这些字段,以防止改变视频字节或其URI。为了让客户端了解视频的总字节数,它可以先向URI发出HEAD请求,并使用从响应中返回的内容长度
当然,这对于它自己的媒体类型来说是个screems,但这正是REST实际上的全部内容。我不知道为什么有这么多人滥用REST术语进行普通的URI设计,或者认为当REST实际上并不关心URI布局时,整齐的URI-API更加RESTful。