當開發一個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 person
或Put (Person person)
,因爲我從中獲得了最小的好處。爲什麼不只是將所有內容反序列化爲字典(儘管對於json只有真正可行)?
我是否缺少關於REST的基本知識?是否可能將Id和1屬性反序列化爲模型對象,然後檢索完整對象並更新它?我應該迫使我的消費者每次都通過一切,然後驗證它嗎?
我喜歡消費者通過一大塊json或xml,併到達我的控制器的時候我只是在處理一個對象。這似乎有點混亂,所有這些忽略了屬性和預先獲取更新等現有記錄等。除非我從根本上誤解REST?
我同意服務器對警察實體級元數據的責任。我的觀點更多的來自於你有像MVC 4的WebAPI這樣的設置,它將傳入的json/xml解析爲一個對象,並調用傳入該對象的方法。它只是感覺有點混亂,只能創建這個對象,然後修改細節。也許我錯過了點... – David 2012-08-17 11:11:45
也許我錯過了什麼?無論服務器端表示如何,相同的數據都將來自客戶端。我看到它的方式,與平臺無關,有兩種方法可以表示這一點:1)作爲請求數據一部分的名稱/值對的標準集合,2)從請求中解析的名稱/值對的哈希集數據,3)具有來自請求數據的字段的模型。在一天結束時,它的相同信息只是表示不同。我的個人偏好是#3,只是因爲它使我不必從名稱/價值數據中填充模型。 – 2012-08-17 13:37:52