2015-08-24 51 views
1

我正在設計一個REST服務,它需要創建一個引用各種其他項目作爲子項目的項目。該服務提供了將可用子項作爲選項進行檢索的方法,這些選項可以作爲鍵/值對綁定到下拉列表中。我的問題是,在創建新的頂級項目時,最好的做法是將整個子項目包含在字段中,還是隻包含引用它的ID?使用子元素設計休息服務的最佳做法

例如,如果我有一項服務使用戶能夠爲筆記本電腦指定處理器和RAM。將會有一個方法GET /processors,它將返回將觸發對象創建的處理器列表和POST /laptops。下面兩種有效載荷中的哪一種被認爲是最佳做法?

POST /筆記本電腦

{ 
    "processor": 123, 
    "ram" 16 
} 

POST /筆記本電腦

{ 
    "processor": {"id":123, "manufacturer": "Intel", "model": "i5-4670k"} 
    "ram" 16 
} 

當檢索的筆記本電腦我會回到這樣的事情:

GET /筆記本電腦

[{ 
    "id:" 3000, 
    "processor": {"id":123, "manufacturer": "Intel", "model": "i5-4670k"} 
    "ram" 16 
}] 

回答

0

如果所有部分t帽子用於構建筆記本電腦是預定義的(或者已經存在),最好只使用該部分的ID。因此,這將是:

POST /筆記本電腦

{ 
    "processorID": 123 
} 

爲什麼?因爲這樣您可以節省帶寬並簡化服務器端的驗證。不是檢查處理器的所有字段,只是檢查是否存在給定ID的進程 - 如果不是409 CONFLICT應該返回。

如果您希望啓用用戶到創建筆記本電腦創建過程中的部件,則應發送特定部件的整個主體。然而,這不是一個好主意。在RESTful方法中,您應創建所有部分,然後創建一臺筆記本電腦 - 指向上一段。

最重要的是以一致的方式設計API - 在所有端點中都採用相同的方式。

現在,當談到返回筆記本電腦時,最好只返回ID。這種方法將與創建新實體(僅發送ID)兼容,但帶寬參數可能有點誤導 - 客戶需要提出多個請求以獲取所有部分的詳細信息。所以..在這種情況下,我將添加名爲format的查詢參數,它接受兩個值SIMPLE(默認)和EXTENDED。如果只傳遞SIMPLE則返回ID是否EXTENDED通過則返回整個實體。

相關問題