我有一个我已经构建的RESTFul服务器API。它的某些部分不控制资源,我无法将相关的URL + HTTP方法映射到服务器上执行的操作。
e.g。我可以使用POST /backup
备份服务器上的每个资源,但我不确定这是否是最合适的映射。单个资源怎么样?我应该使用:POST /backup/id
指定它还是将id声明为我发送的变量:POST /backup <id>
请给我一些关于如何最恰当地构建这些内容的提示,以便我的API易于掌握。
答案 0 :(得分:6)
这取决于您每次调用时是否在数据库上创建新的备份对象,或者您是否有许多仅包含最后一个值的备份对象(例如,不同文件的备份)。
POST /backups
用于创建新对象,如果您始终创建新备份,则使用正确的答案。
PUT /backups/id
。
答案 1 :(得分:6)
我相信POST /backup
(备份所有资源)和POST /backup <id>
(备份单个资源)最适合您。
CRUD MAPPING:像Ray说的那样,备份不会很好地映射到CRUD;您希望服务器上的操作资源执行该功能。 MarkMassé写了O'Reilly book on REST API design,his recommendation是在这种情况下在服务器上使用动作资源(参见Action原型的幻灯片20)。
URI DESIGNATION:操作资源应该是URI的最后一段,没有子资源。当您在下面看到最适合哪种HTTP方法的原因时,这将是有意义的。
HTTP方法:备份不应该是idempotent操作,因此您需要非幂等的HTTP方法。那是POST.
不仅PUT是幂等的,你指定的URI就是放置你发送的资源的地方。如果你想要安宁,你不想这样做。 POST及其非幂等性的部分目的是specified为
提供一个数据块,例如提交表单的结果 数据处理过程
这就是你想要的。
<强> REST:强> 要成为分层系统,服务器(通过其动作资源(备份方法))应指定其输出应该去的位置;客户不应该掌握这种逻辑。
因此,这样做,您的备份操作资源可以自由决定您要放置备份的位置(可能是商店资源(/backups
);请参阅slide 19)以及是否想要覆盖以前的备份,或者是否要实现某种形式的版本控制(REST设计不考虑)。所以基本上你是在正确的轨道上!
答案 2 :(得分:1)
虽然RESTafarians(REST纯粹主义者)会说REST API中的唯一操作应该是映射HTTP动词的基本CRUD操作 - GET
,PUT
,POST
和DELETE
- 这有时不切实际,使你的工作比实际需要更困难。如果您想要执行其他操作(例如“备份”),则可能需要考虑RPC样式的REST实现,该实现同时使用HTTP谓词和请求URL中嵌入的操作名称来确定正在执行的操作。
GET /resource/select
GET /resource/select?id={id}
PUT /resource/update?id={id}
POST /resource/insert
DELETE /resource/delete?id={id}
PUT* /resource/backup?id={id}
GET /resource/backup?id={id}
*如果您的应用程序维护多个资源备份,并且您希望备份操作始终创建新备份,则通常使用POST
,因为备份不是幂等的。如果您只维护一个备份,而备份操作只是备份资源的备份,那么您应该使用PUT,因为在这种情况下备份是幂等的。
答案 3 :(得分:0)
您可以使用POST /backups?resource=car&id=123
使用 id = 123 备份汽车(当然,您可以传递JSON对象而不是URL中的参数你比较喜欢)。另请注意 backups 中的复数形式,它是一个细节,但它更好地传达了在此URI下可以找到一个或多个备份的事实。
如果你想替换以前创建的备份,那么就像其他人提到的那样,你可以使用PUT,也许就像这个PUT /backups/456?resource=car&id=123
,它说“用id = 456替换备份,用你要创建的备份用id = 123“备份汽车。
最后,如果您想在一个步骤中备份所有资源,则可以使用相关参数,例如POST /backups?all=true
或类似参数。如果您希望这些备份替换以前的备份,则在运行此备份之前,您可以使用DELETE /backups
。