在 RESTful 服务中超越 CRUD
Going beyond CRUD in RESTful services
我正在开发 WCF RESTful 服务并注意到在某些地方我可以用不止一种方式表示非 CRUD 操作(不是资源)。
假设我们购买了新的 TV 并将其连接到我们的专用网络。现在我们要构建一个 Web 服务 以便查看和控制电视。
为了读取和更新电视的属性,我们将使用以下 URI:
http://domain/tv/ 获取 | PUT - 获取和更新电视属性。 (company
, owner
, inches
)
对于消费视频,我们将使用以下 URI:
ws://domain/tv/video -(假设 WebSocket 是视频内容传输的最佳选择)
和操作:
updateVersion
startBIT
(内置自检)
changeChannel
turnVolumeUp
, turnVolumeDown
第一个设计是使用属性来表示操作。服务器将注意到 属性 更改,然后执行所需的操作。最后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
这里好像GET
和POST
就够了。您只需要 GET
所有测试或特定测试的结果或 POST
新测试。
http://domain/tv/ PATCH ({volume: 10})
和 http://domain/tv/ PATCH ({channel: 29})
因为两者非常相似 - 我将 PUT
更改为 PATCH
- 请记住,在使用 PUT
时你需要包括整个对象 - 即 - 每个 属性。 PUT
也是幂等操作。使用 PATCH
时,您只能更改一个 属性。
我正在开发 WCF RESTful 服务并注意到在某些地方我可以用不止一种方式表示非 CRUD 操作(不是资源)。
假设我们购买了新的 TV 并将其连接到我们的专用网络。现在我们要构建一个 Web 服务 以便查看和控制电视。
为了读取和更新电视的属性,我们将使用以下 URI:
http://domain/tv/ 获取 | PUT - 获取和更新电视属性。 (
company
,owner
,inches
)对于消费视频,我们将使用以下 URI:
ws://domain/tv/video -(假设 WebSocket 是视频内容传输的最佳选择)
和操作:
updateVersion
startBIT
(内置自检)changeChannel
turnVolumeUp
,turnVolumeDown
第一个设计是使用属性来表示操作。服务器将注意到 属性 更改,然后执行所需的操作。最后POST进行属性无法表示的操作:
http://domain/tv/ GET | PUT - getting or setting
volume
orchannel
using a json objects.and for
updateVersion
orstartBIT
: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
orturnVolume
第三种设计是将每个可以发音为名词的操作表示为资源,其余为属性:
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
这里好像
GET
和POST
就够了。您只需要GET
所有测试或特定测试的结果或POST
新测试。http://domain/tv/ PATCH ({volume: 10})
和http://domain/tv/ PATCH ({channel: 29})
因为两者非常相似 - 我将
PUT
更改为PATCH
- 请记住,在使用PUT
时你需要包括整个对象 - 即 - 每个 属性。PUT
也是幂等操作。使用PATCH
时,您只能更改一个 属性。