2012-08-16 52 views
1

當開發一個REST Api什麼是處理我稱之爲對象級元數據,CreatedBy,CreatedOn,ModifiedBy,ModifiedOn等的最佳方式?REST Api處理元數據,CreatedOn等

一個典型的類可能是:

public class Person { 
    public Guid Id {get; set;} 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
    public DateTime CreatedOn {get; set} 
    public Guid CreatedBy {get; set;} 
} 

我曾經認爲在一個理想的世界REST HTTP方法將被直接映射到控制器的方法,如:

public void Post (Person person) { 
    ...perform the logic to add a person. 
} 

所以消費者你API理論上可以發佈:

{ 
    "Id": "...guid...", 
    "FirstName": "Joe", 
    "LastName" : "Bloggs", 
    "CreatedOn" : "01/01/12", 
    "CreatedBy" : "...guid..." 
} 

然而,它不坐在我身邊的消費settintin gs Id,CreatedOn和CreatedBy。我認爲這不是消費者的責任。因此,這給我留下了我的Post方法做:

public void Post (Person person) { 
    person.Id = Guid.NewGuid(); 
    person.CreatedOn = DateTime.Now; 
    person.CreatedBy = ...get user credentials from request... 
} 

那麼消費者就可以自由張貼通過:

{ 
    "FirstName": "Joe", 
    "LastName" : "Bloggs" 
} 

如果我們想使用PUT方法做一個更新?嗯,這給我們留下了同樣的問題,如果我不希望(或信託)做消費者通過該元數據,然後它讓我不得不做這在我Put方法:

public void Put (Person person) { 
    Person existingPerson = myRepository.GetEmployee(person.Id); 

    existingPerson.FirstName = person.FirstName; 
    existingPerson.LastName = person.LastName; 

    myRepository.Save(existingEmployee);   
} 

我開始懷疑是否有真正的要點將消費者json/xml反序列化爲模型對象,並且通過了Post (Person personPut (Person person),因爲我從中獲得了最小的好處。爲什麼不只是將所有內容反序列化爲字典(儘管對於json只有真正可行)?

我是否缺少關於REST的基本知識?是否可能將Id和1屬性反序列化爲模型對象,然後檢索完整對象並更新它?我應該迫使我的消費者每次都通過一切,然後驗證它嗎?

我喜歡消費者通過一大塊json或xml,併到達我的控制器的時候我只是在處理一個對象。這似乎有點混亂,所有這些忽略了屬性和預先獲取更新等現有記錄等。除非我從根本上誤解REST?

回答

1

在我看來,您正在考慮的設計選項並非特定於REST,而是一般適用於服務設計。我讀到這裏的基本問題似乎是 - 誰負責填充這些字段,調用者或服務的業務邏輯?

對於我的兩分錢,我認爲這是服務器的責任有兩個原因。首先是安全。客戶端腳本本質上是不安全的,因此不應該被信任。例如,一個有動機的人可以很容易地僞造你的審計線索,並使其看起來好像另一個用戶執行了該動作。其次,我將審計/ ID字段的人口看作是交叉調用被調用方法的實際業務目的的邏輯。爲了創建一個人,客戶不應該知道如何表示id的實現細節。

至於使用詞典與模型,我將其視爲個人偏好。這兩種方法都不能迫使客戶通過全套領域。兩者都會支持客戶端只傳遞操作的主要字段集合的設計。實體化到模型或字典中會簡單地丟失您的審計/ ID字段。同樣,這兩種方法都不需要驗證服務器端的只讀字段,因爲不能保證它們在客戶端沒有更改。

+0

我同意服務器對警察實體級元數據的責任。我的觀點更多的來自於你有像MVC 4的WebAPI這樣的設置,它將傳入的json/xml解析爲一個對象,並調用傳入該對象的方法。它只是感覺有點混亂,只能創建這個對象,然後修改細節。也許我錯過了點... – David 2012-08-17 11:11:45

+0

也許我錯過了什麼?無論服務器端表示如何,相同的數據都將來自客戶端。我看到它的方式,與平臺無關,有兩種方法可以表示這一點:1)作爲請求數據一部分的名稱/值對的標準集合,2)從請求中解析的名稱/值對的哈希集數據,3)具有來自請求數據的字段的模型。在一天結束時,它的相同信息只是表示不同。我的個人偏好是#3,只是因爲它使我不必從名稱/價值數據中填充模型。 – 2012-08-17 13:37:52