2012-08-16 25 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