什么是使用Web API进行部分更新的目前推荐的方法是什么?(What's the curr

2019-07-17 21:36发布

我不知道如何实现与ASP.NET的Web API的RESTful接口部分更新? 比方说,比如我们传递的对象在以下结构的线材:

public class Person {
    public int Id { get; set; }
    public string Username { get; set; }
    public string Email { get; set; }
}

如何将一个支持更新只是部分Person的时间,例如Email财产? 它是建议通过实现这个的OData和PATCH动词,或者它会更好地执行PATCH自己?

Answer 1:

有是Web API的当前最新的稳定版本不支持(从2012年8月)。 所以,如果你想使用的网络API RTM,你就必须自己实现整个管道。

随着中说,预发布的OData包通过新的支持部分更新非常漂亮Delta<T>对象。 目前Microsoft.AspNet.WebApi.OData包是在RC版本已经(0.3),可以从这里获得: http://www.nuget.org/packages/Microsoft.AspNet.WebApi.OData

一旦安装,就可以使用相应:

[AcceptVerbs("PATCH")]
public void Patch(int id, Delta<Person> person)
{
    var personFromDb = _personRepository.Get(id);
    person.Patch(personFromDb);
    _personRepository.Save();
}

你会从这样的客户端调用它:

$.ajax({
    url: 'api/person/1',
    type: 'PATCH',
    data: JSON.stringify(obj),
    dataType: 'json',
    contentType: 'application/json',
    success: function(callback) {            
       //handle errors, do stuff yada yada yada
    }
});

这样做的明显优势在于,它适用于任何财产,你不必在意你是否更新EmailUsername或诸如此类的东西。

你可能也想看看这个帖子,因为它显示了一个非常类似的技术http://techbrij.com/http-patch-request-asp-net-webapi

编辑(详细信息):为了只使用补丁 ,你不需要任何启用OData的关系,除了添加的OData包-获得进入Delta<TEntityType>对象。

然后,你可以这样做:

public class ValuesController : ApiController
{
    private static List<Item> items = new List<Item> {new Item {Id = 1, Age = 1, Name = "Abc"}, new Item {Id = 2, Age = 10, Name = "Def"}, new Item {Id = 3, Age = 100, Name = "Ghj"}};

    public Item Get(int id)
    {
        return items.Find(i => i.Id == id);
    }

    [AcceptVerbs("PATCH")]
    public void Patch(int id, Delta<Item> item)
    {
        var itemDb = items.Find(i => i.Id == id);
        item.Patch(itemDb);
    }
}

如果你的产品,让我们说:

{
    "Id": 3,
    "Name": "hello",
    "Age": 100
}

您可以补丁/api/values/3有:

{
    "Name": "changed!"
}

并且,将正确更新你的对象。

Delta<TEntity>将跟踪的变化为您服务。 它是一个动态类,充当你的类型的轻量级代理,并会明白,原来对象(即从DB)和一个客户端传递之间的差异。

这不会以任何方式影响你的API的其余部分(当然除了与较新的替换DLL来方便的OData软件包的依赖关系的)。

我添加了一个样本项目来演示PATCH +三角洲的工作-你可以在这里抓住它(it.s VS2012) https://www.dropbox.com/s/hq7wt3a2w84egbh/MvcApplication3.zip



文章来源: What's the currently recommended way of performing partial updates with Web API?