在RESTful服务中超越CRUD

时间:2015-10-17 13:20:25

标签: web-services wcf rest restful-architecture

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

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

  • 为了阅读和更新电视的属性,我们将使用以下URI:

    http://domain/tv/ GET | PUT - 获取和更新电视属性。 (companyownerinches

  • 对于使用视频,我们将使用以下URI:

    ws:// domain / tv / video - (假设WebSocket是视频内容传输的最佳选择)

  • 和操作:

    • updateVersion
    • startBIT(内置自检)
    • changeChannel
    • turnVolumeUpturnVolumeDown

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

  

http://domain/tv/ GET | PUT - 使用json对象获取或设置volumechannel

     

以及updateVersionstartBIT

     

http://domain/tv/发布{{function:'updateVersion'}或{function:'startBIT'}

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

  

http://domain/tv/commands发布{{命令:'BIT',发件人:'Dan'...} - 创建执行startBITchangeChannelturnVolume <的新命令/ p>

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

  

http://domain/tv/versionUpdates GET | PUT |删除| POST

     

http://domain/tv/BITs GET | PUT |删除| POST

     

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

     

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

什么是最好的RESTful设计?

1 个答案:

答案 0 :(得分:3)

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

我会申请的更改:

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

    我将versionUpdates更改为firmware - 似乎更具自我描述性。这里的PUT操作似乎没有任何意义 - 你可能不知道新版本的固件。因此,GET会返回当前的固件版本,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时,您只能更改一个属性。