在一个实体上重载多个动作

时间:2010-08-14 04:42:59

标签: rest restlet

我正在试图弄清楚如何最好地布置一组Restlet API。 我有一个User实体,它可能有标准的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}

处理代码可能如下(psuedo):

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

真的不好主意?真的忍者的想法?

2 个答案:

答案 0 :(得分:1)

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

Sun Cloud API does just this

  • 获取VM返回一个表示VM,其中包含作为执行功能的URI的“控制器”(参见description of the VM media type
  • 客户端了解媒体类型,识别控制器(例如,VM提供“开始”,“停止”等。
  • 该特定VM的控制资源的URI就在那里

正如您所看到的,如果您使用/1.0/user/resetPassword/1.0/user?op=resetPassword/1.0/resetPassword?userId=xyzzy有点无关紧要,因为客户真的不应该关心,它仅仅跟随表示中的链接。

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

答案 1 :(得分:1)

这些怎么样?

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

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