Web services 在RESTful服务中超越CRUD

Web services 在RESTful服务中超越CRUD,web-services,wcf,rest,restful-architecture,Web Services,Wcf,Rest,Restful Architecture,我正在使用WCF RESTful服务,并注意到在某些地方,我可以用多种方式表示非CRUD操作(而不是资源) 假设我们购买了一台新的电视,并将其连接到我们的专用网络。现在我们想要构建一个Web服务,以便查看和控制电视 为了读取和更新电视的属性,我们将使用以下URI: GET | PUT-获取和更新电视属性。(公司,所有者,英寸) 对于消费视频,我们将使用以下URI: ws://domain/tv/video-(假设WebSocket是视频内容传输的最佳选择) 和操作: updateVersio

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

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

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

    GET | PUT-获取和更新电视属性。(
    公司
    所有者
    英寸

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

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

  • 和操作:

    • updateVersion
    • startBIT
      (内置自检)
    • change频道
    • turnVolumeUp
      turnVolumeDown
第一种设计是使用属性来表示操作。服务器将注意到属性更改,然后执行所需的操作。最后,对属性无法表示的操作进行后期处理:

GET | PUT-使用json对象获取或设置
频道

对于
updateVersion
startBIT

使用{function:'updateVersion'}或{function:'startBIT'}发布

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

使用{command:'BIT',sender:'Dan'…}发布-创建新命令以执行
startBIT
changeChannel
turnVolume

第三种设计是将每个操作表示为资源,其余操作表示为属性:

获取|放置|删除|发布

获取|放置|删除|发布

PUT({卷:10})

PUT({channel:29})

什么是最好的RESTful设计?

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

我将应用的更改:

  • http://domain/tv/firmware 获取|删除|发布

    我将
    版本更新
    更改为
    固件
    ——似乎更具自我描述能力。更重要的是,这里的
    PUT
    操作似乎没有任何意义-您可能事先不知道固件的新版本。因此,
    GET
    返回当前固件版本,
    DELETE
    删除最新版本并恢复以前版本,
    POST
    查找并安装最新版本

  • http://domain/tv/BITs 获取|帖子

    这里看来
    GET
    POST
    就足够了。您只需
    获取所有测试或特定测试的结果,或者只需
    发布新测试

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

    由于两者非常相似-我将
    PUT
    更改为
    PATCH
    -请记住,在使用
    PUT
    时,您需要包含整个对象-即-每个属性
    PUT
    也是幂等运算。使用
    PATCH
    时,您只能更改单个属性


音量和频道也可以是资源…@David能给我一个音量吗?并非所有东西都适合REST,RPC就是其中之一。资源不一定对应于物理或具体对象。设置音量:POST/blah/volume/100,更改频道:PUT/blah/channel/13@David考虑到POST的语义,
POST-tv/volume/100
到底意味着什么
PUT tv/channel/13
可能意味着您想更新频道13的频率或描述,但不是说电视应该切换到该频道。为什么你要用两个不同的动词来设置两个不同事物的当前状态,这两个事物在同一时间自然只能有一个处于活动状态-除非在频道的情况下有多个调谐器?不,不是,但是看看当我将
音量
替换为
更改音量
时会发生什么,你明白我的意思吗?如果我们发布到
blah/changeVolumeTo/10
,这意味着我们的设计很糟糕。您如何看待第二个选项(命令)?当使用
命令时
我们封装了常见的TV操作(尽管这似乎是把所有操作都当作一个名词来处理的一个技巧,太泛化了。。我同意使用尽可能多的名词(固件和位),我把命令当作操作的包装器。我认为将函数视为资源有点尴尬,尤其是它不会保留在服务器端,而是被调用;)命令可能对远程控制有用(如果您需要对其建模的话)——但是,它不是一个函数,而是一个资源。我理解用REST对现实世界建模有时非常困难,但是我们应该尽可能地遵守一般规则。是的,但如何以RESTful方式调用函数?是的,我意识到调用函数需要以RESTful方式,例如,将新卷放入
http://domain/tv/
是一个更加轻松的方法。