2017-04-11 28 views
1

我想將操作添加到我的REST API中,以便在不同「存儲」之間移動「資源」。在RESTful URL中使用動詞和形容詞的替代方案

例如,假設我的資源通過以下網址正常訪問:

/resources 
/resources/{resourceId} 

現在假設我想「停用」一些資源,即在概念上它移動到另一個子文件夾。最直接的方法就是遵循這一點。

  1. '取消'資源,即導致資源在/ resources下不可用。從概念上講,它是移動「對象的 '/資源/取消/' 子文件夾:

    POST /resources/{resourceId}/deactivate 
    

    或者:

    POST /resources/deactivated/{resourceId} 
    
  2. 獲取所有停用的對象:

    GET /resources/deactivated  
    
  3. 顛倒'禁用'動作,即從概念上將對象從'/resources/deactivated/'子文件夾返回到主文件夾('/resources')。

    要麼

    POST /resources/{resourceId}/reactivate  
    

    或者

    POST /resources/deactivated/{resourceId}/restore  
    

    這個API似乎相當直觀的我。但它似乎違反了我在許多最佳實踐中看到的'更喜歡名詞'規則 - 有關REST API的文章:我使用動詞和形容詞來代替名詞!

請注意,我可能有所有端點的參數,例如, GET/resources/deactivated?createdBefore = 01022017

對於我的REST API有更好的選擇嗎?即更多RESTful,但不是更不直觀的?

回答

4

首先,請記住,REST代表重新表象小號泰特牛逼轉讓(BOT)。

這全是關於資源及其狀態。操作如激活,停用移動都是關於用新的表示替換資源的當前狀態,並且您不需要URL中的動詞來表示這樣的操作。

PUT /api/resources/[id]/status HTTP/1.1 
Host: example.org 
Content-Type: application/json 

{ "status" : "active" } 

可以理解爲更換:


例如,要替換資源的狀態,您可以在PUT請求的有效載荷發送資源的新表示通過[id]標識的資源的狀態與請求有效負載中發送的資源的狀態。


然後,你可以有以下與特定的狀態,以獲得資源:

GET /api/resources?status=active HTTP/1.1 
Host: example.org 
Accept: application/json 

可以理解爲給我的所有資源的表示與狀態active


移動資源到另一個文件夾,例如,你可以有:

PUT /api/resources/[id]/folder HTTP/1.1 
Host: example.org 
Content-Type: application/json 

{ "target" : "draft" } 

可以理解爲替換派出由[id]與一個標識的資源的文件夾請求有效載荷

+1

我喜歡你的答案(投票),因爲它給了我一個更好的瞭解REST方法。但我不認爲簡單地改變'狀態'屬性對我來說是不可接受的,因爲'GET/resources'不應該返回被禁用的屬性。 – Alexander

+1

@Alexander要獲取所有資源,您可以請求'GET/api/resources'。它將返回活動和非活動的。要過濾'resources'集合,可以使用'status'之類的查詢參數。所以'GET/api/resources?status = active'會返回活動的,而'GET/api/resources?status = inactive'會返回不活動的。您可以爲您的查詢參數設定默認值。如果'status'被忽略,假設你只想要活動的。 –

+0

我不同意。 'GET/resources'應該返回所有的對象,而不管特定屬性的值如何,否則它會很混亂。但另一方面,它不應該返回「停用」的,這意味着它不是簡單的常規屬性。 – Alexander

2

是活動的資源真的比停用RESO不同urce?考慮只需要一個跟蹤active的房產。您可以隨時篩選出來,如

GET /things?active=true 

您可以用microPUT

PUT /things/{id}/active 
false 

如果thingdeactivated-thing在概念上是不同的,這是合理的有兩個單獨的端點改變這一點財產。我會用

POST `/deactivated-things` 
{ 
    "thing": "/things/12" 
} 

它們之間移動
POST `/things` 
{ 
    "deactivated-thing": "/deactivated-things/12" 
} 

你應該儘量避免多重含義的路徑。例如,不這樣做:

/resources/{id} 
/resources/deactivated/{id} 

/resources後,不要超載路徑段的含義。

0

感謝Cassio強調'改變對象狀態'的方法。

我自己的答案的完整性:

PATCH /resources/{resourceId} with body {"active":false} -- deactivate a resource 
PATCH /resources/{resourceId} with body {"active":true} -- restore a resource 
GET /resources      -- return all 'normal' resources 
GET /resources?includeInactive=true -- return all resources including the deactivated ones 
GET /resources/{resourceId}   -- return the resource 

(通過在 'GET' 將包含屬性檢索到的資源的積極=真/假「)。

似乎是一個經典案例PATCH:REST API PATCH or PUT

相關問題