Rest API设计PUT与PATCH

时间:2016-08-29 15:24:35

标签: rest

我正在开发2个REST API,它可以在我的后端编辑和暂停一些东西。 对于我正在使用的编辑:

PUT /video/1

开发暂停视频服务的最佳方式是什么。我应该使用PATCHPUT吗?输入只是id。如果我使用PUT那么如何区分编辑和暂停?如果我有另外一个API要开发用于例如:视频重启,我如何在REST API中容纳这些动词?

2 个答案:

答案 0 :(得分:3)

使用HTTP方法区分状态只是一个糟糕的想法。你能做的是:

  1. 介绍state,然后使用PATCH更改状态:

    PATCH /vidoes/1
    {
       "state": "PLAYING|PAUSED|STOPPED" // what you need here
    }
    
  2. 心灵don't patch like an idiot,然而像傻瓜一样修补是很常见的。

    1. 引入将反映在资源上调用的操作的新端点 - 这不是完全RESTful,但也很常见:

      POST /vidoes/1/play/
      POST /vidoes/1/stop/
      POST /vidoes/1/pause/
      
    2. 编辑

      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。