当开发一个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