什么是Odata?
OData,全称Open Data Protocol,是由微软在2007年推出的一款开放协议,旨在通过简单、标准的方式创建和使用查询式及交互式RESTful API。通过OData协议可以有效减少开发人员的工作量。.
使用环境
新建一个ASP.NET Core Mvc项目,最好.NET Core 3.1以上版本,3.1之下的版本微软已不受支持。在项目里添加“Microsoft.AspNetCore.OData”包或者用如下命令添加。
dotnet add package Microsoft.AspNetCore.OData
准备模型
OData是基于模型的,这里我们用简单的一个模型来模拟。
public class Dog
{
public int Id { get; set; }
public string Name { get; set; }
public string Color { get; set; }
}
创建Edm模型
OData使用EDM,类似Entity Data Model来描述数据的结构。新建一个在ModelBuilder类,在文件中添加创建GetEdmModel方法。
public static class ModelBuilder
{
public static IEdmModel GetEdmModel()
{
var odataBuilder = new ODataConventionModelBuilder();
odataBuilder.EntitySet<Dog>("Dog");
return odataBuilder.GetEdmModel();
}
}
注册和注入OData服务
在Startup文件的ConfigureServices方法里注册OData服务。
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddOData();//注册OData服务
}
在Startup文件的Configure方法里的路由终结点注入OData服务。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
//开放的查询条件 允许执行Select、过滤、排序、统计,最大展示10条
endpoints.Select().Filter().OrderBy().Count().MaxTop(10);
//注入
endpoints.MapODataRoute("odata", "odata",ModelBuilder.GetEdmModel());
});
}
浏览元数据
启动项目后可以浏览元数据(/odata/$metadata),如下这个我本地的站点地址http://localhost:21336/odata/$metadata,这里面列出了所映射的实体,效果如下:
如显示如上图所示,证明配置安装成功
在Controller里使用
我们创建一个Controller模拟几个接口,模拟几条数据,这里就不直接链接数据库了。Controller需要继承ODataController类,这下面是几种请求方法。
[Route("api/[controller]")]
[ApiController]
public class DogController : ODataController
{
//模拟数据
public static IList<Dog> Dogs = new List<Dog>
{
new Dog {Id = 1, Name = "花花", Color = "black"},
new Dog {Id = 2, Name = "金毛", Color = "yellow"},
new Dog {Id = 3, Name = "小灰灰", Color = "gray"},
new Dog {Id = 4, Name = "卡卡", Color = "gray"},
};
//使用OData需要加上 EnableQuery
[HttpGet, EnableQuery]
public ActionResult Get()
{
return Ok(Dogs);
}
[HttpGet, EnableQuery]
public IActionResult Get([FromODataUri]int key)
{
return Ok(Dogs.FirstOrDefault(b => b.Id == key));
}
//创建
[HttpPost]
public IActionResult Post(Dog person)
{
Dogs.Add(person);
return Created(person);
}
//修改
[HttpPatch]
public IActionResult Patch([FromODataUri] int key, Delta<Dog> person)
{
var updateDog = Dogs.FirstOrDefault(p => p.Id == key);
if (updateDog == null) return NotFound();
person.Patch(updateDog);
return Updated(updateDog);
}
//删除
[HttpDelete]
public IActionResult Delete([FromODataUri] int key)
{
var deleteDog = Dogs.FirstOrDefault(p => p.Id == key);
if (deleteDog == null) return NotFound();
Dogs.Remove(deleteDog);
return StatusCode(204);
}
}
查询展示
1、简单查询
我们用postman测试查询,先来查询全部,输入实体名称就可以查询全部
访问id为1的数据
2、更高级的查询
需要在开始终结点设置,前面已经设置。
endpoints.Select().Filter().OrderBy().Count().MaxTop(10);
//这个意思是可以在查询使用Select、过滤、排序、统计,最大展示10条
比如只查询两条数据
过滤查询,比如查询id为3的数据
过滤条件有
结语
本文讲述了OData服务在ASP.NET Core的简单使用,同时通过一些案例介绍OData常用的一些操作。遇到的坑是版本需要跟.NET Cor对应,否则会报版本不对应的问题。篇幅有限更多OData相关的信息可以访问www.odata.org。