我正在开发一个 WCF RESTful 服务,注意到在某些地方,我可以用多种方式表示非 CRUD 操作(而不是资源)。
比如说,我们购买了一台新的电视,并将其连接到我们的私人网络。现在,我们想要构建一个 Web 服务来查看和控制这台电视。
比如说,我们购买了一台新的电视,并将其连接到我们的私人网络。现在,我们想要构建一个 Web 服务来查看和控制这台电视。
读取和更新电视属性我们将使用以下URI:
http://domain/tv/ GET | PUT - 获取和更新电视属性。 (
company
,owner
,inches
)观看视频我们将使用以下URI:
ws://domain/tv/video - (假设WebSocket是传输视频内容的最佳选项)
操作:
updateVersion
startBIT
(内置自检)changeChannel
turnVolumeUp
,turnVolumeDown
第一种设计是使用属性来表示操作。服务器将注意到属性更改,然后执行所需的操作。最后POST无法用属性表示的操作:
http://domain/tv/ GET | PUT - 通过JSON对象获取或设置
音量
或频道
。对于
updateVersion
或startBIT
:http://domain/tv/ POST 并加上 {function: 'updateVersion'} 或 {function: 'startBIT'}
第二种设计是使用Command资源表示所有操作:
http://domain/tv/commands POST 并加上 {command: 'BIT', sender: 'Dan' ... } - 创建新的命令以执行
startBIT
、changeChannel
或turnVolume
第三种设计是将可作为名词发音的每个操作表示为资源,其余操作表示为属性:
http://domain/tv/versionUpdates 获取 | 更新 | 删除 | 提交
http://domain/tv/BITs 获取 | 更新 | 删除 | 提交
http://domain/tv/ 更新 ({volume: 10})
http://domain/tv/ 更新 ({channel: 29})
什么是最佳的RESTful设计?
POST tv/volume/100
的实际含义是什么,考虑到 POST 的语义?PUT tv/channel/13
可能意味着您想要更新第 13 个频道的频率或描述,但并不意味着电视机应该切换到该频道。为什么要使用两个不同的动词来设置两个不同事物的当前状态,这两个事物在同一时间自然只能有一个处于活动状态 - 除非在频道的情况下有多个调谐器? - CodeCasterblah/volume/100
时,它看起来像我们在使用动词,而RESTful的方式是使用名词。你的建议看起来与blah/changeChannelTo/23
非常相似。 - Matan Givonivolume
替换为changeVolumeTo
时会发生什么,你明白我的意思吗?如果我们向blah/changeVolumeTo/10
发送 POST 请求,那意味着我们设计得很糟糕。 - Matan Givoni