2012-06-11 44 views
6

我試過Google搜索和搜索無處不在,但無法找到關於此主題的權威性權威。雖然是真正的REST原則,我應該如何設計的HTTP接口:REST風格的數據結構模式

  1. 有序列表(獲取,添加,插入位置,重新排序,刪除)

  2. 一套(獲取,添加,刪除)

  3. 哈希表(獲取,添加,刪除)

注意:這些數據結構都包含已知的IDS

+1

1年後:事實證明,這樣的哲學深思對你的應用程序如何很好的解決問題的影響微乎其微。真正的答案似乎是,只要您不違反任何規格/要求並導致任何問題,您選擇的並不重要。 – dadads

回答

10

這就是我會做一個有序列表和哈希表中現有資源的引用。我猜的方法將是一個集和列表相同:

有序列表

獲取項目123:

GET /list/123 

追加的項目清單:

POST /list/ 

將新項目插入位置5:

POST /list/?position=5 
在第3位

DELETE /list/123 

刪除項目:

DELETE /list/?position=3 

當然,你的API應該更新的指標

移動項目123位置3:

PUT /list/123?position=3 

刪除項目123插入和刪除時的所有元素。

哈希表

獲取項目 「somekey」:

GET /hashtable/somekey 

添加項目 「somekey」:

POST /hashtable/somekey 

刪除項目 「somekey」:

DELETE /hashtable/somekey 
2

@ dadads

你不能直接定義這樣的接口。

有序列表(獲取,添加,插入位置,重新排序,刪除)

通過排除「插入位置」和「重新安排」可以完美實現「搞定」,「添加」和「刪除」,例如:

  • 定義你的資源/服務/用戶
  • 您可以使用POST /服務/用戶新用戶添加到「用戶」收集
  • 即可獲得/服務/用戶檢索用戶
  • 你可以得到/服務/用戶/用戶ID檢索特定用戶
  • 可以刪除/服務/用戶/從用戶收集用戶ID

這是一個非常粗略的例子,雖然它概述了一些想法。爲了實現「重新排序」和「插入到位」,您需要實現自己的動作語義,您可以在資源表示中包含這些動作語義,並讓客戶知道如何執行這些操作。作爲參考,您可以看到這個JSON PATCH規範提案:https://tools.ietf.org/html/rfc6902試圖描述這樣的操作。

沒有必要使用已經存在的媒體格式,你可以在你自己的名字空間下定義你自己的名字,例如:application/vnd.your-company.format-name + json,它描述了這些功能,客戶端。

1

您應該將傳輸機制與底層應用程序分離。我會考慮正確地設計應用程序,然後弄清楚如何通過HTTP訪問它。通過這種方式,您可以輕鬆添加或更改傳輸機制(SOAP,SCA等),而不會影響底層應用程序。

正確設計了應用程序後,請考慮通過類似適配器或訪問者模式的方式從HTTP請求中訪問它。

1

這是我的重新排序的想法。

有一種稱爲PATCH的HTTP方法,用於更新資源的片段。給你的資源稱爲index新的屬性,然後進行補丁方法的調用

PATCH /collection 

[ 
    { 
    "id: "original index 0" 
    "index": 1 
    } 
    { 
    "id: "original index 1" 
    "index": 0 
    } 
] 

然後你的服務器後端需要弄清楚如何原子做到這一點。但接口方面,我認爲這是保持對RESTful的最佳方式。

或者,有一個更好的解決方案,但它可能不適用於每個人的情況。由於訂購總是取決於某種標準,它甚至可以像插入訂單一樣簡單。讓你的收集URL支持一個orderBy查詢字符串,並讓這個orderBy指示如何排序結果。然後,在重新排序來自客戶端的調用期間,只需更新用於排序條件的資源屬性即可。

0

我來到這個問題主要是尋找一個RESTful的方式來重新排序。我真的不喜歡任何答案,所以這裏是我認爲最RESTful的。

對於重新排序,你可以下訂單的資源:

/list/order

然後,你可以做它的正常操作(這些例子假定5個項目,目前它的列表):

"items":" [ 
    { 
     "id": "A", 
     "name": "Monkey" 
    }, 
    { 
     "id": "B", 
     "name": "Cow" 
    }, 
    { 
     "id": "C", 
     "name": "Horse" 
    }, 
    { 
     "id": "D", 
     "name": "Turkey" 
    }, 
    { 
     "id": "E", 
     "name": "Tasmanian Devil" 
    }, 
] 

請注意,「訂單」不包含在資源響應中。這不是必需的 - 訂單由項目的響應順序隱式指定。

GET /list/order

返回正確的順序項ID列表

['A','B','C','D','E']

POST /list/order 與有效載荷['D','B','C','A','E']

GET /list/order

返回正確的順序

['D','B','C','A','E']

也明顯當你在/listGET你將返回的項目列表中按正確的順序項ID的列表。

GET /list

返回的項目列表中正確的順序

"items":" [ 
    { 
     "id": "D", 
     "name": "Turkey" 
    }, 
    { 
     "id": "B", 
     "name": "Cow" 
    }, 
    { 
     "id": "C", 
     "name": "Horse" 
    }, 
    { 
     "id": "A", 
     "name": "Monkey" 
    }, 
    { 
     "id": "E", 
     "name": "Tasmanian Devil" 
    }, 
]