在ASP.NET Core中使用WebAPI数据协议OData

什么是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,这里面列出了所映射的实体,效果如下:

在ASP.NET Core中使用WebAPI数据协议OData

如显示如上图所示,证明配置安装成功

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测试查询,先来查询全部,输入实体名称就可以查询全部

在ASP.NET Core中使用WebAPI数据协议OData

访问id为1的数据

在ASP.NET Core中使用WebAPI数据协议OData

2、更高级的查询

需要在开始终结点设置,前面已经设置。

endpoints.Select().Filter().OrderBy().Count().MaxTop(10);//这个意思是可以在查询使用Select、过滤、排序、统计,最大展示10条

比如只查询两条数据

在ASP.NET Core中使用WebAPI数据协议OData

过滤查询,比如查询id为3的数据

在ASP.NET Core中使用WebAPI数据协议OData

过滤条件有

在ASP.NET Core中使用WebAPI数据协议OData

篇幅有限详情请访问:
https://www.odata.org/documentation/odata-version-3-0/odata-version-3-0-core-protocol/

结语

    本文讲述了OData服务在ASP.NET Core的简单使用,同时通过一些案例介绍OData常用的一些操作。遇到的坑是版本需要跟.NET Cor对应,否则会报版本不对应的问题。篇幅有限更多OData相关的信息可以访问www.odata.org。