2011-05-27 40 views
2

我是一個REST noob嘗試設計我的第一個REST API模式。管理文件夾層次結構中資源的良好RESTful做法是什麼?

考慮一個簡單的REST API來列出/查看/編輯/刪除用戶對象。我們可以使用以下2種URL模式進行路由:

/users   # GET returns a list of users, POST allows creation of new user 
/users/{userid} # GET returns user info, PUT for updating user info, DELETE to delete user 

到目前爲止,這麼好。現在讓我們說,用戶可以安排在可嵌套的文件夾中。所以用戶現在可以在一個文件夾內,並且一個文件夾可以包含用戶和子文件夾。要允許文件夾的管理,我們希望以下功能添加到我們的API:

  • 目錄內容的文件夾
  • 的(用戶和子文件夾)創建一個新的文件夾
  • 重命名,刪除文件夾
  • 用戶或子文件夾移動到不同的父文件夾

什麼是一個REST API提供此功能的最佳方式?我想出了兩個想法:

理念1:顯示文件夾層次URL

例如/users/folder1/folder2/chris

乍一看,這看起來不錯,但也有一些這種方法的問題:

  • 用戶和文件夾現在具有相同的URL模式。無法知道/users/a/b/c是否指向用戶或文件夾。這會導致難以理解的API,以及涉及手動解析URL和猜測的煩人實現。

  • 當客戶端發送POST/users/folder1我們不知道他們是要創建一個新用戶還是新建一個子文件夾。他們將不得不在請求主體中指定。再次,這導致惱人的服務器端實現,並且看起來不是很RESTful。

  • 沒有明顯的方式,允許從一個文件夾資源移動到另一個

理念2:添加父文件夾信息資源

保持如上所示的簡單的2 URL模式,將一個parentFolder字段添加到用戶資源。

例如一個GET/users可以返回(在JSON):

{'users': 
    [{'name':'chris','DoB':'1/1/1900','parentFolder':'/folder1/folder2'}, 
    ...] 
} 

添加單獨的URL模式/folders/folders/{folderid}用於查看/編輯/刪除的文件夾。

這解決了與想法一的問題,但在設計方面,它讓我感到不安:

  • 添加資源的父作爲資源的屬性似乎很奇怪。

  • 爲什麼我們不得不將用戶和他們的文件夾分離到不同的API中,即使它們顯然是相互關聯的?

感謝您閱讀這篇文章。他們是否有更好的方式來處理這個問題?

+0

這是什麼意思_to you_用戶在文件夾中?這個概念讓我感到困惑...... – 2011-05-27 14:45:44

+0

@Donal:我承認把用戶放入文件夾並不那麼直觀。但是我們的產品允許用戶在文件夾層次結構中安排幾乎所有類型的對象,爲了保持一致性,我們還允許管理員將用戶分組到文件夾中。將來,API將支持系統中各種對象的管理,而不僅僅是用戶。 – 2011-05-30 00:19:14

回答

1

添加鏈接到您的用戶資源以確定包含的文件夾絕對沒有什麼奇怪的。 REST風格的設計有95%是關於在資源和5%之間添加鏈接以決定URI的樣子。

使用用戶資源或文件夾資源對/ users/a/b/c執行POST不應引起您的擔憂。做RESTful HTTP的主要優點之一是你不受RPC限制。我們習慣於靜態定義什麼是輸入參數和輸出參數的過程調用。 HTTP有像Content-Type這樣的頭域,允許在運行時定義輸入和輸出參數。

我相信你是正確的,選項#2可能會比選項#1更容易在服務器上發送。但是,只要您通過使用服務器返回客戶端可能需要的所有鏈接來避免客戶端上的URI構造,則對於您的客戶端來說,任一選項都應該沒問題。

移動用戶可以像將用戶發佈到新文件夾一樣簡單,並讓服務器判斷是否需要將用戶從舊文件夾中刪除。

+0

感謝您的建議和保證。最後,我去了選項2,向資源添加一個字段來保存它的位置。 – 2011-05-31 00:12:13

0

我在思考同樣的問題。

目前我傾向於http響應Content-Type頭應用程序/八位字節流與應用程序/ json通知客戶端,如果有效載荷是數據vs文件夾資源並允許正確解釋有效載荷。

相關問題