过去几周我一直在尝试使用Web API 2,我正在尝试找出在部分更新期间处理特定方案的最佳方法。
API将允许用户通过POST进行部分更新。根据设计,假定请求正文中未提供的任何属性都保持不变,并且不会对这些属性进行任何更改。
然而,挑战是尝试确定用户何时将属性值显式设置为null。当通过控制器引入请求主体时,任何缺席属性都会自动设置为null,因为反序列化了JSON请求主体。因此,我无法确定属性值是否显式为null(即用户尝试将属性值设置为null,在这种情况下我想将属性更新为null)或者属性值是否为null隐式(即在deserilaization期间属性值设置为null,在这种情况下我想忽略它。)
我正在寻找有关如何处理这种情况的任何想法。
答案 0 :(得分:0)
我已经玩了一下这个,我想出办法来解决这个问题。也许还有另一种解决问题的方法,但这似乎是一种合理的方法:
在Web API中,请求正文只能读取一次。因此,如果您让控制器为您拉入对象,则对象将被反序列化,您将无法访问原始请求内容,并且无法确定某些内容是否显式为null或不存在。这可以通过以下方式证明:
[Route("cars"), HttpPost]
public IHttpActionResult AddCar(Car car)
{
Car newCar = Car.Add(car);
return Created<Car>("/cars/" + newCar.car_id, newCar);
}
如果您希望能够准确检查发送的内容,则不会让控制器为您拉入对象,而是手动拉取请求主体,从而保留您查看确切内容的能力像这样寄来:
[Route("cars"), HttpPost]
public IHttpActionResult AddCar()
{
HttpContent content = Request.Content;
string carJson = content.ReadAsStringAsync().Result;
// You now have the original JSON and can examine it before deserialization
}
它肯定会增加一些步骤,但至少在我的情况下,我需要能够确切地看到POST的内容,这提供了一个似乎有用的解决方案。