什么RESTful HTTP请求在服务器上执行操作?

时间:2013-05-23 15:21:05

标签: api http rest

我有一个我已经构建的RESTFul服务器API。它的某些部分不控制资源,我无法将相关的URL + HTTP方法映射到服务器上执行的操作。

e.g。我可以使用POST /backup备份服务器上的每个资源,但我不确定这是否是最合适的映射。单个资源怎么样?我应该使用:POST /backup/id指定它还是将id声明为我发送的变量:POST /backup <id>

请给我一些关于如何最恰当地构建这些内容的提示,以便我的API易于掌握。

4 个答案:

答案 0 :(得分:6)

这取决于您每次调用时是否在数据库上创建新的备份对象,或者您是否有许多仅包含最后一个值的备份对象(例如,不同文件的备份)。

POST /backups用于创建新对象,如果您始终创建新备份,则使用正确的答案。

如果您要在同一对象中更新备份数据,请

PUT /backups/id

restufull routes

答案 1 :(得分:6)

我相信POST /backup(备份所有资源)和POST /backup <id>(备份单个资源)最适合您。

CRUD MAPPING:像Ray说的那样,备份不会很好地映射到CRUD;您希望服务器上的操作资源执行该功能。 MarkMassé写了O'Reilly book on REST API designhis 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操作 - GETPUTPOSTDELETE - 这有时不切实际,使你的工作比实际需要更困难。如果您想要执行其他操作(例如“备份”),则可能需要考虑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

相关问题