使用ASP.NET Web API更新API请求架构或设计模式中的某些字段

问题描述:

我有一个API可以更新已存在的实体。该实体可以通过也存在API的接口手动更新。使用ASP.NET Web API更新API请求架构或设计模式中的某些字段

我的问题是如何只更新供应商可能通过实体上的API发送的某些字段的良好设计模式或架构?我不想用NULL或空字符串覆盖字段,因为他们在发送到API时不知道这些值,但是数据库中的实体可能已经具有该字段的值。

这也应该考虑到供应商是否想要将字段重置为某种空字符串。

实体API模式

ID 
Name 
TwitterHandle 

实体数据库与价值观范式

ID = 200 
Name = Hello 
TwitterHandle = @hello 

实体模型请求发送到API与价值观

ID = 200 
Name = Hello2 

该请求应该只将名称更新为Hello2,但只保留TwitterHandle。然而,在另一要求,他们可以重置TwitterHandle如果事情与它(NULL,空字符串)发送

+1

我会建议接受只包含能够被编辑为特定的呼叫特性的视图模型或DTO。这意味着你可能有多个。不要通过您的API来回发送实体。 – ovation22

+0

我有100个客户端使用这个API,所以我不打算为每个客户创建一个模型 –

想我找到了一个解决方案与Newtonsoft

JsonConvert.PopulateObject 

Populate Object

+0

你测试过吗?因为它不适合我。我尝试了他们的动态对象的示例,但没有注意到任何更改后,我的项目PopulateObject方法 –

+0

是的,我测试了它? –

+0

也实施它,像魅力一样工作 –

如果你想在API级别做到这一点,那么你可以使用HttpPatch如下

public void Patch(Guid id, JsonPatchDocument<SomeDto> patch) { 
    // Perform validation 
    var objectToUpdate = repo.GetById(id); // replace this with your database call 
    patch.ApplyUpdatesTo(objectToUpdate); 
    repo.Save(objectToUpdate); // save it to database 
} 

我会采取的另一种方法是使用Automapper。我将创建dto对象和automapper映射类,将dto转换为数据库模型。这样您也将遵循单一责任原则,因为您的映射将成为automapper配置的责任

+0

好的建议。该补丁似乎有一堆额外的东西,你必须发送来做一个我不想要的更新。我们已经使用了automapper,所以我们可以为这个场景做一个映射,但是又决定了哪些属性应该被更新。我认为最好的选择是手动序列化请求并测试请求中是否有可用属性,然后更新数据库模型属性,这两个属性都必须是精确的。 –

我们过去做过的一件事是创建一个端点“http://webapi.com/twitter/200/name”,然后做一个包含更新。这并不完美,但它完成了工作,而且很容易实现。

+0

靠近,但他们可能想要更新多个属性。我不希望他们发送逗号分隔列表。我宁愿发送一个对象,以通用方式验证缺少的字段,只更新放入请求中的字段。 –

+0

在这一点上唯一要做的事情确实是类似于补丁的东西,你可以使用JsonObject,但是你的映射配置不会很好玩。请记住,从json中删除了空值,因此无法判断它们是否发送null或什么也没有。 – ClaytonHunt