2010-08-14 55 views
1

我在想如何最好地佈局一組Restlet API。 我有一個用戶實體,它可能有標準的CRUD操作,很適合休息,但也有其他的,比如「重置密碼」或「終止」。Restlet在一個實體上執行多個操作

最好的方法是什麼?

這裏是我的想法是:

/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 
} 

非常糟糕的主意?真的忍者的想法?

回答

1

我認爲這是一個好主意。如果你希望你的應用程序是RESTful的,你必須在你的用戶資源的表示中提供鏈接,並將它們記錄爲執行選定操作的URI。

Sun Cloud的API does just this

  • 得到一個VM返回表示VM包括 「控制器」 是執行功能(見description of the VM media type
  • 客戶知道的媒體類型的URI,識別控制器(例如,虛擬機提供了「啓動」,「停止」等
  • URI控制資源的該特定VM就在那裏

所以你可以看到,如果使用/1.0/user/resetPassword/1.0/user?op=resetPassword/1.0/resetPassword?userId=xyzzy是有點無關緊要,因爲客戶真的不應該關心,它只是遵循陳述環節。

另外,記得使用POST這種行動,因爲他們通常不冪等,他們可能有副作用。

+0

'/1.0/user?op = resetPassword'遠離RESTful,對於'/1.0/resetPassword?userId = xyzzy'也一樣都不是RESTful,它們是RPC over HTTP – 2011-12-13 22:01:10

+0

@JarrodRoberson對不起,我恭敬地不同意。如果客戶端看到

,然後去構建一個GET /1.0/user?op=resetPassword作爲結果,那麼它就像你將要得到的那樣遠離RPC。 RPC和REST的格式和結構都不是*,而是都在客戶端找出URI,以及它們是在客戶端硬編碼還是在運行時發現。 – mogsie 2012-01-10 20:09:20

1

這些怎麼樣?

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

,不要忘記mogsie的點,客戶端應該從其他文件發現這些URL,它不應該知道他們提前。

+0

我不會說如果刪除一個人的密碼以獲得一個新密碼,那麼它就是如此明顯。但是如果每個密碼都是自己的資源,它可能是一個很好的冪等的東西,重新刪除它不會有任何效果,因爲刪除一個密碼會在不同的URI上生成一個新的密碼資源。有趣的想法。 – mogsie 2010-08-14 16:14:05