武装你的WEBAPI-OData资源更新Delta
本文属于OData系列
目录
- 武装你的WEBAPI-OData入门
- 武装你的WEBAPI-OData便捷查询
- 武装你的WEBAPI-OData分页查询
- 武装你的WEBAPI-OData资源更新Delta
- 武装你的WEBAPI-OData之EDM
- 武装你的WEBAPI-OData常见问题
- 武装你的WEBAPI-OData使用Endpoint
Introduction
OData不光提供了数据查询的便捷手段,它也提供了数据更新的方便办法。
传统WebAPI方式
一般用于数据更新的方式,最多的就是PUT和PATCH方法了。关于这两个方法的区别以及介绍,可以翻看我之前写的RESTful设计中的常见疑问。
举例说明:
[AllowAnonymous]
[HttpPut]
[ProducesResponseType(typeof(ReturnData<CarInfo>), Status200OK)]
[ProducesResponseType(typeof(ReturnData<string>), Status409Conflict)]
public async Task<ActionResult> Put([FromBody] Models.CarInfo value)
{
var info = new Info<CarInfo>();
var res = await info.Put(value);
if (res != null) return Ok(new ReturnData<CarInfo>(res));
else return Conflict(new ReturnData<string>("数据已经存在"));
}
[HttpPatch()]
[Authorize(Roles = "Administrator, Supervisor")]
[ProducesResponseType(typeof(ReturnData<CarInfo>), Status200OK)]
[ProducesResponseType(typeof(ReturnData<string>), Status404NotFound)]
public async Task<ActionResult> Patch([FromBody] Models.CarInfo value)
{
var info = new Info<CarInfo>();
var res = await info.Patch(value);
if (res != null) return Ok(new ReturnData<CarInfo>(res));
else return NotFound(new ReturnData<string>("无法找到原数据"));
}
public async ValueTask<T?> Put(T value)
{
//只列出关键代码
var res = await dbset!.FindAsync(key.GetValue(value) as string);
if (res != null)
{
//return null;
context.Entry(res).CurrentValues.SetValues(value);
}
else
{
value.CreateDate = DateTime.Now;
dbset.Add(value);
await context.SaveChangesAsync();
return value;
}
}
Put和Patch方法主要是实现数据库对应实体的替换逻辑,这里我就不贴详细的代码了。
可以发现,我需要传入的是一个CarInfo的对象,替换这个对象,我们就可以实现资源的更新了。
OData资源更新Delta
当然用上面这个方式可以实现资源的更新,不过也存在几个问题:
- 需要传递较为完整的对象(其实这一点不太充分,现在的webapi不完整也能成功解析数据对象;
- 无法追踪对象的变化;
- 更新需要自己写逻辑实现;
OData提供了一个叫做Delta<>的泛型类,Delta就是Δ,物理里面一般用来表示变化量。OData的这个类,也是用来表示一个对象的变化的。
[Table("deviceinfo")]
public class DeviceInfo
{
[Key]
[MaxLength(200)]
public string DeviceId { get; set; }
public string CameraId { get; set; }
public string AppKey { get; set; }
public string AppSecret { get; set; }
public string Name { get; set; }
public string DeviceType { get; set; }
public string Location { get; set; }
public string Description { get; set; }
}
[Produces("application/json")]
[ProducesResponseType(typeof(Order), Status200OK)]
[ProducesResponseType(Status400BadRequest)]
[Authorize(Roles ="Administrator")]
[ODataRoute("({id})")]
public async Task<IActionResult> Patch(string id, Delta<DeviceInfo> delta)
{
if (!ModelState.IsValid) return BadRequest(new ODataError() { ErrorCode = "400", Message = "Data is not valid" });
var infos = await _context.DeviceInfoes.FindAsync(id);
delta.GetInstance().CameraId = infos.CameraId;
delta.Patch(infos);
//获得更改过的属性名称
var ps = delta.GetChangedPropertyNames();
await _context.SaveChangesAsync();
return Ok();
}
使用Delta<>的时候,不需要发送对象的全部属性,只需要发送变化的部分即可。对于上面的请求,我们只需要发送Key属性(用于确定数据)和变化的属性即可。另外,delta提供了追踪变化的一系列方法:GetChangedPropertyNames()之类的,可以很方便地继续手动处理,也提供了GetInstance()方法获得数据对象,可以很方便的进行拓展。
一般使用的话,Delta还提供Post和Put方法,和WebAPI定义的行为一致,这样用起来也非常直观。
总结
OData提供了Delta泛型,能够包装我们的数据对象,可以极大地简化资源更新的开发工作。
武装你的WEBAPI-OData资源更新Delta的更多相关文章
- OData 带更新的实例,并能取得元数据格式类型
http://www.cnblogs.com/kid1412/p/6012938.html#CreateANewEntity <<ABP框架>> OData 集成 文档目录 ...
- OData – the best way to REST–实例讲解ASP.NET WebAPI OData (V4) Service & Client
一.概念介绍 1.1,什么是OData? 还是看OData官网的简单说明: An open protocol to allow the creation and consumption of quer ...
- AspNet WebApi OData 学习
OData介绍:是一个查询和更新数据的Web协议.OData应用了web技术如HTTP.Atom发布协议(AtomPub)和JSON等来提供对不同应用程序,服务 和存储的信息访问.除了提供一些基本的操 ...
- [转]OData – the best way to REST–实例讲解ASP.NET WebAPI OData (V4) Service & Client
本文转自:http://www.cnblogs.com/bluedoctor/p/4384659.html 一.概念介绍 1.1,什么是OData? 还是看OData官网的简单说明: An open ...
- 基于Quick-cocos2d-x的资源更新方案 二
写在前面 又是12点半了,对于一个程序员来说,这是一个黄金时间,精力旺盛,我想,是最适合整理和分享一些思路的时候了. 自从上次写了 基于Quick-cocos2d-x的资源更新方案 同样可见quick ...
- 基于Quick-cocos2d-x的资源更新方案 一
图片来自网络 思绪何来 昨天写了一篇关于更新方案的理论 游戏开发:通过路径搜索优先级来进行补丁升级(从端游到手游) 今天继续细化一下 由于新项目采用的是Quick-cocos2d-x,那我就直接给出我 ...
- AspNet.WebAPI.OData.ODataPQ
AspNet.WebAPI.OData.ODataPQ实现WebAPI的分页查询服务 AspNet.WebAPI.OData.ODataPQ实现WebAPI的分页查询服务-(个人拙笔) AspNet. ...
- AspNet.WebAPI.OData.ODataPQ实现WebAPI的分页查询服务-(个人拙笔)
AspNet.WebAPI.OData.ODataPQ 这是针对 Asp.net WebAPI OData 协议下,查询分页.或者是说 本人在使用Asp.Net webAPI 做服务接口时写的一个分页 ...
- 主攻ASP.NET MVC4.0之重生:Asp.Net MVC WebApi OData
1.新建MVC项目,安装OData Install-Package Microsoft.AspNet.WebApi.OData -Version 4.0.0 2.新建WebAPI Controller ...
随机推荐
- 聊聊风口上的 eBPF
eBPF 是一个用于访问 Linux 内核服务和硬件的新技术,由于其灵活性和高性能等特点,被迅速用于网络.出错.跟踪以及防火墙等多场景.目前国内已有少数企业开始尝试将 eBPF 引入生产实践,又拍云也 ...
- 每日一个linux命令5 -- rm
rm命令.rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除.对于链接文件,只是删除了链接,原有文件均保持不变. rm是一个危险的命 ...
- 俯瞰Dubbo全局,阅读源码前必须掌握这些!!
写在前面 在上一篇<冰河开始对Dubbo下手了!>一文中,我们重点介绍了为何要学习Dubbo,而且还是要深入理解Dubbo的原理和核心源码.既然是要写深度解析Dubbo源码的系列专题,我们 ...
- NAT模式/路由模式/全路由模式 (转)
route全路由NAT NAT模式.此模式下,由局域网向广域网发送的数据包默认经过NAT转换,但路由器对所有源地址与局域网接口不在同一网段的数据包均不进行处理.例如,路由器LAN口IP设置为192.1 ...
- R语言学习笔记-单一决策树
决策树比较简单明晰,但存在不稳定的风险,数据的微小变化会导致最佳决策树结构的巨大变化,且决策树可能会变得比较复杂. 其算法原理参见https://zhuanlan.zhihu.com/p/148010 ...
- NOIP初赛篇——05计算机语言
程序 程序就是一系列的操作步骤,计算机程序就是由人实现规定的计算机完成某项工作的操作步骤.每一步骤的具体内容能够理解的指令来描述,这些指令告诉计算机"做什么"和"怎么 ...
- 【SpringBoot1.x】SpringBoot1.x 消息
SpringBoot1.x 消息 文章源码 概述 大多应用中,可通过消息服务中间件来提升系统异步通信.扩展解耦能力. 消息服务有两个重要概念,即消息代理(message broker)和目的地(des ...
- Mac安装homebrew,postman,charles
Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装.卸载.更新.查看.搜索等很多实用的功能.简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径的情况,十分方便快捷. 1. ...
- CAN总线采样点测试
采样点是什么? 采样点是接受节点判断信号逻辑的位置,CAN通讯属于异步通讯.需要通过不断的重新同步才能保证收发节点的采样准确. 若采样点太靠前,则因为线缆原因,DUT外发报文尚未稳定,容易发生采样错误 ...
- 【Java】运算符(算术、赋值、比较(关系)、逻辑、条件、位运算符)
运算符 文章目录 运算符 1. 算术运算符 2. 赋值运算符 3. 比较运算符 4. 逻辑运算符 5. 条件运算符 6. 位运算符 7. 运算符优先级 8. 运算符操作数类型说明 9.code 算术运 ...