在 RESTful 服务中超越 CRUD

Going beyond CRUD in RESTful services

我正在开发 WCF RESTful 服务并注意到在某些地方我可以用不止一种方式表示非 CRUD 操作(不是资源)。

假设我们购买了新的 TV 并将其连接到我们的专用网络。现在我们要构建一个 Web 服务 以便查看和控制电视。

第一个设计是使用属性来表示操作。服务器将注意到 属性 更改,然后执行所需的操作。最后POST进行属性无法表示的操作:

http://domain/tv/ GET | PUT - getting or setting volume or channel using a json objects.

and for updateVersion or startBIT:

http://domain/tv/ POST with {function: 'updateVersion'} or {function: 'startBIT'}

第二种设计是使用 Command 资源表示所有操作:

http://domain/tv/commands POST with {command: 'BIT', sender: 'Dan' ... } - create new command for performing startBIT, changeChannel or turnVolume

第三种设计是将每个可以发音为名词的操作表示为资源,其余为属性:

http://domain/tv/versionUpdates GET | PUT | DELETE | POST

http://domain/tv/BITs GET | PUT | DELETE | POST

http://domain/tv/ PUT ({volume: 10})

http://domain/tv/ PUT ({channel: 29})

什么是最好的RESTful设计?

第三个选项(经过下面提到的修改)似乎设计得最好 - 因为 REST 是关于资源和名词的,而不是关于动词和操作的。

我要应用的更改:

  • http://domain/tv/firmware GET | DELETE | POST

    我会将 versionUpdates 更改为 firmware - 似乎更具自我描述性。更何况这里的 PUT 操作似乎没有任何意义 - 你可能先验地不知道新版本的固件。所以 GET returns 当前固件版本,DELETE 删除最新版本并恢复以前版本,POST 查找并安装最新版本。

  • http://domain/tv/BITs GET | POST

    这里好像GETPOST就够了。您只需要 GET 所有测试或特定测试的结果或 POST 新测试。

  • http://domain/tv/ PATCH ({volume: 10})http://domain/tv/ PATCH ({channel: 29})

    因为两者非常相似 - 我将 PUT 更改为 PATCH - 请记住,在使用 PUT 时你需要包括整个对象 - 即 - 每个 属性。 PUT也是幂等操作。使用 PATCH 时,您只能更改一个 属性。