在开发 REST Api 时,处理我所说的对象级元数据、CreatedBy、CreatedOn、ModifiedBy、ModifiedOn 等的最佳方法是什么?
一个典型的类可能是:
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..."
}
但是,它不适合我的消费者设置 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
or是否有任何真正意义,Put (Person person)
因为我从中获得了最微不足道的好处。为什么不将所有内容反序列化为字典(尽管仅对 json 真正可行)?
我错过了一些关于 REST 的基本知识吗?可能将 Id 和 1 属性反序列化为模型对象,然后检索完整对象并更新它是否正常?我是否应该强迫我的消费者每次都通过所有内容然后验证它?
我喜欢消费者通过一大块 json 或 xml 并且当它到达我的控制器时我只是在处理一个对象的想法。所有这些忽略属性和预取现有记录以进行更新等似乎有点混乱。除非我从根本上误解了 REST?