2017-05-23 47 views
0

我有一個概念性的問題,寧靜的API。在我的數據模型中,我有國家和公司。Restful APIs:只讀/只寫字段

API的用戶將無法創建國家對象。國家數據庫中有不斷的條目。他們將創建具有國家作爲一個領域的公司對象。所以,創建公司的時候,API需要一個JSON,如:

{ 
    'name': 'company name', 
    'country': 5, // country id 
    ... 
} 

在客戶端,顯示公司的時候,我們也想顯示其國家。解決這個問題的方法之一是,在獲得公司資源後,我們會發出另一個獲取請求來獲取國家/地區對象。但這種方法在性能方面存在問題,特別是在我們列出多家公司的頁面上。

另一種方法是將包括在另一個領域的國家信息對GET請求,如:

{ 
    'name': 'company name', 
    'country': 5, // country id 
    'country_details': { 
     'name': 'USA', 
     'phone_code': 1, 
     'id': 5 
    } 
    ... 
} 

我不認爲這是正確的做法要麼,因爲數據表示的職位不同,發送GET請求爲同一資源。對此案有任何建議嗎?

回答

1

...由於數據表示不同於發佈並獲取相同資源的請求。

POSTRFC 7231

POST方法請求的是目標資源過程中 表示封閉在請求......

鑑於PUT

PUT方法請求該狀態的目標資源爲 創建或替換爲由請求消息負載中包含的表示 定義的狀態。給定 表示的成功PUT將表明,在相同的 目標資源上的後續GET將導致在200(OK)響應中發送的等效表示 。

和:

所述POST的根本區別和PUT方法是 由不同意圖用於封閉表示突出顯示。 POST請求中的目標資源旨在根據資源本身的語義 處理 封閉表示,而PUT請求中的封閉表示被定義爲 ,以替換目標資源的狀態。

所以POSTGET機構不同的是沒有問題的,但它是爲PUTGET。我會通過不使用相同的URL POSTGET來使區分更清晰。無論如何,這是有道理的,因爲GET將包括公司標識符,而POST不會。

例如,也許是有道理的公司被張貼到一個國家的URL,這樣,我們就不需要包括在體內的國家ID:

POST: /usa/company 

BODY: { 'name': 'company name' } 

RESPONSE: 200 with Content-Location header: /companies/1 

然後,它的後續GETContent-Location

GET: /companies/1 

RESPONSE: { 'name': 'company name', 'country': 'USA' }