【发布时间】:2015-09-01 20:23:05
【问题描述】:
这里是场景。有一个 web api put 调用来更改 sql server 数据库中的对象。如果它们在 webapi 调用 json 中明确指定,我们只想更改数据库对象上的字段。例如:
{ "Name":"newName", "Colour":null }
这应该将“名称”字段更改为“newName”并将“颜色”字段更改为空。与这个json相反:
{ "Name":"newName" }
应该只更改名称字段,保持旧的颜色值不变。
使用 WebApi 检测属性是否通过的好方法是什么?
如果我这样定义我的方法:
[HttpPut]
[Route("/item/{id}")]
public void ChangeItem(int id, Item item)
{
...
}
item.Colour 在任何一种情况下都将为空。请注意,我在这里使用多种数据类型,示例中的属性Colour 可能是int、string、DateTime、Guid 等。
我知道我可以使用[FromBody] 属性获取原始 json,然后自己解析它,但似乎默认活页夹已经完成了大部分工作(包括验证),所以我很好奇我怎么能重用它,也能达到我想要的。最简单的方法是什么?
更新:
我想澄清一下,我的是一个“偶尔连接”的场景。也就是说,使用 API 的设备大部分时间都在网络覆盖范围之外,它们会不时使用 API 进行同步。
实际上,这意味着需要同步的大部分数据都聚合为零个或一个“推送更新到服务器”调用,然后是“从服务器获取最新状态”调用。在后端使用 Sql Server 和 EF 会导致多个不同(有时是不相关的)实体包含在单个 json 中。例如:
class TaskData
{
public IList<User> AssignedUsers {get; set;}
public IList<Product> Products {get; set;}
public Task Task {get; set}
}
此外,用于为 GET 调用生成 json 的模型类与 EF 实体是分开的,因为数据库架构与 API 对象模型不完全匹配。
【问题讨论】:
-
说实话,put是幂等的。你需要 patch...
-
@AndreiV,是的,是的。让我们不要争论什么是纯粹的休息,什么不是=)
-
我也不喜欢...作为一种解决方法,您可能需要一个更改属性列表作为附加参数。
-
@AndreiV 是的。现在就是这样。还是很尴尬。我的 api 消费者问我为什么需要这个列表,如果我能说出我需要的所有表单 json...
-
@YuvalItzchakov,你知道吗。这可能只是可行的。虽然我们需要就每种类型的值达成一致(如
int.MaxValue、new Guid("ffffffff-ffff-ffff-ffff-ffffffffffff")、DateTime.MaxValue等。我会考虑的。)谢谢你的建议。
标签: c# .net json asp.net-web-api