簡體   English   中英

通過 REST (RESTful) API 進行批量集合操作

[英]Bulk Collection Manipulation through a REST (RESTful) API

我想要一些關於設計 REST API 的建議,它允許客戶端有效地向集合添加/刪除大量對象。

通過 API,客戶端需要能夠將項目添加到集合中並從中刪除項目,以及操作現有項目。 在許多情況下,客戶端希望對集合進行批量更新,例如添加 1000 個項目並刪除 500 個不同的項目。 感覺客戶端應該能夠在與服務器的單個事務中完成此操作,而不是需要 1000 個單獨的 POST 請求和 500 個 DELETE。

有沒有人有關於實現這一目標的最佳實踐或約定的任何信息?

我目前的想法是,應該能夠 PUT 一個表示集合 URI 更改的對象,但這似乎與HTTP 1.1 RFC不一致,這似乎表明 PUT 請求中發送的數據應該獨立於URI 中已經存在的數據。 這意味着客戶端必須一次性發送集合的新狀態的完整描述,這很可能比更改大得多,甚至比客戶端發出請求時所知道的還要多。

顯然,如果有必要,我很樂意偏離 RFC,但如果存在這樣的約定,我更願意以傳統方式執行此操作。

您可能希望將更改任務本身視為一種資源。 因此,您實際上是在 PUT 處理單個對象,即批量數據更新對象。 也許它有一個名稱、所有者和需要解析和執行的 CSV、XML 等大塊。 對於 CSV,您可能還想確定 CSV 數據中表示的對象類型。

列出作業、添加作業、查看作業狀態、更新作業(可能是為了啟動/停止它)、刪除作業(如果它正在運行則停止它)等。這些操作很容易映射到 REST API 設計。

完成此操作后,您可以輕松添加批量數據更新程序可以處理的不同數據類型,甚至可以在同一任務中混合在一起。 換句話說,無需為您要導入的每種類型的內容在整個應用程序中復制相同的 API。

這也很容易用於后台任務實現。 在這種情況下,您可能希望向各個任務對象添加字段,以允許 API 客戶端指定他們希望如何收到通知(他們希望您在完成后獲取的 URL,或向他們發送電子郵件等) .

是的,PUT 創建/覆蓋,但不會部分更新。

如果您需要部分更新語義,請使用 PATCH。 請參閱http://greenbytes.de/tech/webdav/draft-dusseault-http-patch-14.html

您應該使用AtomPub 它專為通過 HTTP 管理集合而設計。 甚至可能有您選擇的語言的實現。

至少對於 POST,您似乎應該能夠 POST 到列表 URL 並讓請求正文包含新資源列表而不是單個新資源。

據我了解,REST 意味着 REpresentational State Transfer,因此您應該將狀態從客戶端傳輸到服務器。

如果這意味着來回傳遞的數據過多,那么您可能需要更改表示形式。 一個 collectionChange 結構可以工作,通過一系列刪除(通過 id)和添加(帶有嵌入的完整 xml 表示),發布到處理接口 URL。 接口實現可以選擇自己的方法進行刪除和添加服務器端。

最純粹的版本可能是通過 URL 定義項目,並且集合包含一系列 URL。 新集合可以在客戶端更改后進行 PUT,然后是一系列添加的項目的 PUT,如果您想從服務器中實際刪除項目而不是僅僅從該列表中刪除它們,則可能進行一系列刪除。

您可以引入不需要整個狀態轉移的現有集合元素的元表示,因此在一些抽象代碼中,您的更新可能如下所示:

{existing elements 1-100}
{new element foo with values "bar", "baz"}
{existing element 105}
{new element foobar with values "bar", "foo"}
{existing elements 110-200}

添加(和修改)元素是通過定義它們的值來完成的,刪除元素是通過不提及它來完成的,新集合和重新排序元素是通過指定新順序來完成的(如果順序已存儲)。

通過這種方式,您可以輕松呈現整個新集合,而無需重新傳輸整個內容。 使用If-Unmodified-Since標頭可確保您對內容的想法確實與服務器的想法相匹配(這樣您就不會意外刪除您在提交請求時根本不知道的元素)。

最好的方法是:

Pass Only Id Array of Deletable Objects from Front End Application To Web API
    2. Then You have Two Options: 
       2.1 Web API Way : Find All Collections/Entities using Id arrays and Delete in API , but you need to take care of Dependant entities like Foreign Key Relational Table Data too
     2.2. Database Way : Pass Ids to your database side, find all records in Foreign Key Tables and Primary Key Tables and Delete in same order i.e. F-Key Table records then P-Key Table records

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM