1

我试图弄清楚如何最好地布置一组 Restlet API。我有一个用户实体,它可能有标准的 CRUD 操作,非常适合休息,但还有其他的,比如“重置密码”或“终止”。

最好的方法是什么?

这是我的想法:

/1.0/user/update        //perhaps this would just be a PUT on /1.0/user
/1.0/user/resetPassword //This would reset the password, but also send an email.
/1.0/user/terminate     //This might do some additional cleanup

然后我会制作一个真正像这样附加的 UserResource

/1.0/user/{actionType}

处理代码可能如下所示(伪):

action = request.getAttributes().get("actionType");
if (action == "update") {
   do update
} elif (action == "resetpassword") {
   do resetpassword
} elif (action == "terminate") {
   do terminate
}

真的是坏主意吗?真的是忍者的主意吗?

4

2 回答 2

1

我认为这是一个不错的主意。如果您希望您的应用程序是 RESTful 的,您确实必须在表示中为您的用户资源提供链接,并将它们记录为执行所选操作的 URI。

Sun Cloud API就是这样做的:

  • GET a VM 返回一个表示 VM,包括“控制器”,它们是执行功能的 URI(请参阅VM 媒体类型的描述
  • 客户端知道媒体类型,识别控制器(例如,VM 提供“启动”、“停止”等。
  • 该特定 VM 的控制资源 URI 就在那里

如您所见,如果您使用/1.0/user/resetPasswordor /1.0/user?op=resetPasswordor/1.0/resetPassword?userId=xyzzy有点无关紧要,因为客户端真的不应该关心,它只是遵循表示中的链接。

此外,请记住对此类操作使用 POST,因为它们通常不是幂等的,并且可能有副作用。

于 2010-08-14T08:40:21.153 回答
1

这些怎么样?

PUT /user/bob 
DELETE /user/bob/password 
DELETE /user/bob 

并且不要忘记 mogsie 的观点,即客户端应该从其他文档中发现这些 URL,它不应该提前知道它们。

于 2010-08-14T13:53:58.713 回答