当前建议使用 Web API 执行部分更新的方法是什么?



我想知道如何实现部分更新与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更好?

目前最新的稳定的 Web API版本(2012年8月起)不支持。因此,如果你只想使用Web API RTM,你就必须自己实现整个管道。

话虽如此,OData预发布包通过新的Delta<T>对象非常好地支持部分更新。目前microt.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

EDIT (more info):为了只使用PATCH,您不需要启用任何与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
}

你可以用:

PATCH到/api/values/3
{
    "Name": "changed!"
}

,这将正确地更新你的对象。

Delta<TEntity>将为您跟踪更改。它是一个动态类,作为您的Type的轻量级代理,并将理解原始对象(即来自DB)和客户端传递的对象之间的差异。

这不会以任何方式影响你的API的其余部分(当然,除了用新的dll替换dll来促进OData包的依赖)。

我添加了一个示例项目来演示PATCH + Delta的工作-您可以在这里获取它。s VS2012) https://www.dropbox.com/s/hq7wt3a2w84egbh/MvcApplication3.zip

相关内容

  • 没有找到相关文章

最新更新