Web services 在RESTful服务中超越CRUD
我正在使用WCF RESTful服务,并注意到在某些地方,我可以用多种方式表示非CRUD操作(而不是资源) 假设我们购买了一台新的电视,并将其连接到我们的专用网络。现在我们想要构建一个Web服务,以便查看和控制电视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
- 为了读取和更新电视的属性,我们将使用以下URI:
GET | PUT-获取和更新电视属性。(
,公司
,所有者
)英寸
- 对于消费视频,我们将使用以下URI: ws://domain/tv/video-(假设WebSocket是视频内容传输的最佳选择)
- 和操作:
updateVersion
(内置自检)startBIT
change频道
,turnVolumeUp
turnVolumeDown
卷
或频道
对于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
POST-tv/volume/100
到底意味着什么PUT tv/channel/13
可能意味着您想更新频道13的频率或描述,但不是说电视应该切换到该频道。为什么你要用两个不同的动词来设置两个不同事物的当前状态,这两个事物在同一时间自然只能有一个处于活动状态-除非在频道的情况下有多个调谐器?不,不是,但是看看当我将音量
替换为更改音量
时会发生什么,你明白我的意思吗?如果我们发布到blah/changeVolumeTo/10
,这意味着我们的设计很糟糕。您如何看待第二个选项(命令)?当使用命令时
我们封装了常见的TV操作(尽管这似乎是把所有操作都当作一个名词来处理的一个技巧,太泛化了。。我同意使用尽可能多的名词(固件和位),我把命令当作操作的包装器。我认为将函数视为资源有点尴尬,尤其是它不会保留在服务器端,而是被调用;)命令可能对远程控制有用(如果您需要对其建模的话)——但是,它不是一个函数,而是一个资源。我理解用REST对现实世界建模有时非常困难,但是我们应该尽可能地遵守一般规则。是的,但如何以RESTful方式调用函数?是的,我意识到调用函数需要以RESTful方式,例如,将新卷放入http://domain/tv/
是一个更加轻松的方法。