目前推荐使用 Web API 执行部分更新的方法是什么?

2024-04-21

我想知道如何使用 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 http://blogs.msdn.com/b/alexj/archive/2012/08/15/odata-support-in-asp-net-web-api.aspx和 PATCH 动词,或者自己实现 PATCH 会更好吗?


目前最新不支持stableWeb API 发布(从 2012 年 8 月开始)。因此,如果您只想使用 Web API RTM,则必须自己实现整个管道。

话虽如此,OData 预发布包通过新的Delta<T>目的。 目前 Microsoft.AspNet.WebApi.OData 包已经是 RC 版本 (0.3),可以从这里获取:http://www.nuget.org/packages/Microsoft.AspNet.WebApi.OData 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
    }
});

这样做的明显优点是它适用于任何属性,并且您不必关心是否更新Email or Username或者诸如此类的。

您可能还想查看这篇文章,因为它展示了一种非常相似的技术http://techbrij.com/http-patch-request-asp-net-webapi http://techbrij.com/http-patch-request-asp-net-webapi

编辑(更多信息):为了只需使用补丁,您不需要启用任何与 OData 相关的内容,除了添加 OData 包 - 即可访问Delta<TEntityType> object.

然后你可以这样做:

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 with:

{
    "Name": "changed!"
}

这将正确更新您的对象。

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

目前推荐使用 Web API 执行部分更新的方法是什么? 的相关文章

随机推荐

  • SSIS 错误 - 包中的版本号无效

    失败作业对应的日志如下 2014 年 4 月 11 日 06 40 00 LPR New 错误 0 USPHND0088 LPR New 作业 结果 作业失败 该作业由 Schedule 14 调用 LPR New Job 最后运行的一步是
  • 如何检测远程机器的操作系统

    从基于 net 的应用程序中 确定远程计算机上运行的操作系统是 Windows 还是 Linux 的最快方法是什么 只需 ping 一下即可 如果 TTL 生存时间 为 254 或更小 则它是基于 UNIX 的 如果 TTL 为 128 或
  • WPF:多显示器编程

    我在用着WPF in C 我想从多显示器编程开始 这意味着该应用程序将在许多具有不同视图的显示器上显示 我在网上搜索过 我得到了使用的方法Screen AllScreens 但是我有以下问题 有多种方法可以将多台显示器连接到 PC 情况 1
  • PDF 文件中的隐写术 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 有人能告诉我 哪里可以将一些数据隐藏到 PDF 文件中吗 换句话说 PDF 文件中的隐写术 有什么算法可以做到这一点吗 有很多方法可以做到这一点 包括
  • 如何用bind来定义apply?

    在 Haskell 中 Applicatives 被认为比 Functor 更强 这意味着我们可以使用 Applicative 来定义 Functor 例如 Functor fmap a gt b gt f a gt f b fmap f
  • Swift - 在 LaunchScreen 上执行代码 [重复]

    这个问题在这里已经有答案了 在 iOS 中 在应用程序准备就绪之前会有一个 LaunchScreen 您可以在此添加要做的事情 代码 吗 我想在 LaunchScreen 上执行 JSON 请求 但不知道将代码放在哪里 提前致谢 卡塞特 正
  • 是否可以更改 MediaRecorder 的流?

    getUserMedia constrains then stream gt var recorder new MediaRecorder stream recorder start recorder pause get new strea
  • 将对象转换为可编码对象失败

    我收到以下错误 Converting object to an encodable object failed Instance of Patient 0 JsonStringifier writeObject dart convert j
  • Deltaspike 和@Stateless Bean

    我想使用 DeltaSpike API 保护我的 无状态 EJb Stateless Remote UserServiceRemote class public class UserService implements UserServic
  • 我们可以检索 li 的默认计数器值吗?

    我们可以检索到CSSli 的默认计数器值 例如 如果我有 6 个 li 分成 2 ol 但我想要 li 从 1 到 6 列出 而不是从 1 到 3 列出两次 我用了value 4 在第一个 li li 第二个的 ol 所以它有效 但现在因为
  • TeamCity Agent 缺少 DotNetFramework4.0_x86,但不是?

    我一直在尝试将 TeamCity 安装从旧服务器转移到新的 Windows Server 2008 R2 服务器上 我终于完成了所有配置 然而 构建代理说DotNetFramework4 0 x86在构建代理上不可用 但已安装 NET 4
  • 如何查找两个文件的集合差异?

    我有两个文件 A 和 B 我想找到 A 中 B 中没有的所有行 在 bash 使用标准 Linux 实用程序中执行此操作的最快方法是什么 到目前为止 这是我尝试过的 for line in cat file1 do if grep c li
  • 如何在 ionic 4 中提供警报控制器 css?

    我想在 ionic 4 中提供警报控制器样式 这些是我的演示代码 async presentalert const alert await this alertCtrl create header DO YOU WANT TO CANCEL
  • 如何在 python 中将包含所有文件的目录从 c:\\xxx\yyy 复制到 c:\\zzz\

    我一直在尝试使用 copytree src dst 但是我不能 因为目标文件夹应该存在 在这里您可以看到我编写的一小段代码 def copy dir src dest import shutil shutil copytree src de
  • JavaScript 检查元素是否包含类?

    使用纯 JavaScript 不是 jQuery 有什么方法可以检查元素是否contains一类 目前 我正在这样做 var test document getElementById test var testClass test clas
  • 如何编辑 SQL Server 主数据库文件 .mdf

    我有一个 SQL Server 主数据库文件 mdf 我需要一个可以打开文件并让我编辑一些数据的程序 由于字段较多 需要打开所有记录并修改 非常繁琐 这样做是个好主意吗 我总是可以在使用 mdf 文件之前对其进行备份 因为我没有任何编程知识
  • 缩放滚动视图内的旋转图像以适合(填充)覆盖矩形的框架

    Through 这个问题和答案 https stackoverflow com questions 26821725 determine if crop rect is entirely contained within rotated u
  • 如何按特定顺序运行 Nightwatch 测试?

    我有几个测试来测试 UI 并同时用于创建数据 一组单独的测试依赖于此数据 这意味着这些测试必须仅在第一组运行后运行 我知道如何运行一组它们 或者使用标签运行它们 但如何才能按特定顺序运行它们呢 Nightwatch 将按顺序在特定文件中运行
  • Heroku 上的 Go 应用程序以及本地软件包

    我正在尝试使用以下命令在 Heroku 上放置一个 Go 应用程序去构建包 https github com kr heroku buildpack go 当它是基本的东西时这很好 但是一旦我做了一个本地包 它就无法编译 这是一个示例设置
  • 目前推荐使用 Web API 执行部分更新的方法是什么?

    我想知道如何使用 ASP NET Web API 的 RESTful 接口实现部分更新 举例来说 我们通过以下结构的线路传递对象 public class Person public int Id get set public string