mysql odata_.NET Core开发日志之OData(Open Data Protocol)
简述
OData,即Open Data Protocol,是由微软在2007年推出的一款开放协议,旨在通过简单、标准的方式创建和使用查询式及交互式RESTful API。
类库
在.NET Core中想要使用OData功能的话需要添加Microsoft.AspNetCore.OData包。
dotnet add package Microsoft.AspNetCore.OData
准备模型类
public class Address
{
public string City { get; set; }
public string Street { get; set; }
}
public enum Category
{
Book,
Magazine,
EBook
}
public class Press
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public Category Category { get; set; }
}
public class Book
{
public int Id { get; set; }
public string ISBN { get; set; }
public string Title { get; set; }
public string Author { get; set; }
public decimal Price { get; set; }
public Address Address { get; set; }
public Press Press { get; set; }
}
创建Edm模型
OData使用EDM,即Entity Data Model来描述数据的结构。在Startup文件中添加创建方法。
private static IEdmModel GetEdmModel()
{
var builder = new ODataConventionModelBuilder();
builder.EntitySet("Books");
builder.EntitySet("Presses");
return builder.GetEdmModel();
}
注册OData服务
在Startup文件的ConfigureServices方法里注册OData服务。
services.AddOData();
services.AddMvc(options =>
{
options.EnableEndpointRouting = false;
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
这里要注意的是在.NET Core 2.2里,默认已经有终结点,所以要使用OData的终结点的话需要将默认选项禁用掉。
注册OData终结点
同样在Startup文件里,在其Configure方法内将原来的注册路由内容改为注册OData的终结点。
app.UseMvc(b =>
{
b.MapODataServiceRoute("odata", "odata", GetEdmModel());
});
显示元数据
运行程序后访问https://localhost:5001/odata/$metadata地址,可以看到所有可用模型的元数据。
创建Controller
本文实例中不考虑数据库的操作,故而使用hard code方式构建必要的模型对象。
public class BooksController : ODataController
{
private static IList Books {get; set;}
public BooksController()
{
Books = new List
{
new Book
{
Id = 1,
ISBN = "111-0-321-56789-1",
Title = "Calculus",
Price = 66.6m,
Address = new Address
{
City = "Shanghai",
Street = "Beijin Xi Road"
},
Press = new Press
{
Id = 1,
Name = "Shanghai Tongji",
Category = Category.Book
}
},
new Book
{
Id = 2,
ISBN = "222-2-654-00000-2",
Title = "Linear Algebra",
Price = 53.2m,
Address = new Address
{
City = "Shanghai",
Street = "Beijin Dong Road"
},
Press = new Press
{
Id = 2,
Name = "Shanghai Fudan",
Category = Category.EBook
}
}
};
}
[EnableQuery]
public IActionResult Get()
{
return Ok(Books);
}
[EnableQuery]
public IActionResult Get(int key)
{
return Ok(Books.FirstOrDefault(b => b.Id == key));
}
}
EnableQuery特性在需要高级查询的场景时必须添加。
查询
加入Controller之后,访问https://localhost:5001/odata/Books地址,可得到所有Book数据。
{
"@odata.context": "https://localhost:5001/odata/$metadata#Books",
"value": [
{
"Id": 1,
"ISBN": "111-0-321-56789-1",
"Title": "Calculus",
"Author": null,
"Price": 66.6,
"Address": {
"City": "Shanghai",
"Street": "Beijin Xi Road"
}
},
{
"Id": 2,
"ISBN": "222-2-654-00000-2",
"Title": "Linear Algebra",
"Author": null,
"Price": 53.2,
"Address": {
"City": "Shanghai",
"Street": "Beijin Dong Road"
}
}
]
}
访问https://localhost:5001/odata/Books(1)地址,可得到key值为1的Book数据。
{
"@odata.context": "https://localhost:5001/odata/$metadata#Books/$entity",
"Id": 1,
"ISBN": "111-0-321-56789-1",
"Title": "Calculus",
"Author": null,
"Price": 66.6,
"Address": {
"City": "Shanghai",
"Street": "Beijin Xi Road"
}
}
高级查询
如果想要使用OData查询的高级功能,可以在注册终结点时额外加上相应的配置。
app.UseMvc(b =>
{
b.Select().Expand().Filter().OrderBy().MaxTop(100).Count();
b.MapODataServiceRoute("odata", "odata", GetEdmModel());
});
访问网址时加上所需的查询内容:
https://localhost:5001/odata/Books?$select=Id,Title
{
"@odata.context": "https://localhost:5001/odata/$metadata#Books(Id,Title)",
"value": [
{
"Id": 1,
"Title": "Calculus"
},
{
"Id": 2,
"Title": "Linear Algebra"
}
]
}
如果想要按特定条件过滤数据内容的话也很容易:
https://localhost:5001/odata/Books?$filter=Price%20le%2060
{
"@odata.context": "https://localhost:5001/odata/$metadata#Books",
"value": [
{
"Id": 2,
"ISBN": "222-2-654-00000-2",
"Title": "Linear Algebra",
"Author": null,
"Price": 53.2,
"Address": {
"City": "Shanghai",
"Street": "Beijin Dong Road"
}
}
]
}
总结
不难看出,OData的真正魅力在于其对那些高级查询功能的支持,所以在创建RESTful API时,不妨考虑使用OData,这样应该能减少许多不必要的代码工作。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
您可能感兴趣的文章:详解ASP.NET Core应用中如何记录和查看日志
.Net Core项目如何添加日志功能详解
详解.Net Core中的日志组件(Logging)
详解.Net core2.0日志组件Log4net、Nlog简单性能测试
ASP.NET Core开发教程之Logging利用NLog写日志文件
.NET Core日志配置的方法
Asp.Net Core轻松学之利用日志监视进行服务遥测详解
mysql odata_.NET Core开发日志之OData(Open Data Protocol)相关推荐
- .NET Core开发日志——配置
.NET Core开发日志--配置 原文:.NET Core开发日志--配置 熟悉ASP.NET的开发者一定对web.config文件不陌生.在ASP.NET环境中,要想添加配置参数,一般也都会在此文 ...
- .NET Core开发日志——RequestDelegate
本文主要是对.NET Core开发日志--Middleware的补遗,但是会从看起来平平无奇的RequestDelegate开始叙述,所以以其作为标题,也是合情合理. RequestDelegate是 ...
- .NET Core开发日志——WCF Client
WCF作为.NET Framework3.0就被引入的用于构建面向服务的框架在众多项目中发挥着重大作用.时至今日,虽然已有更新的技术可以替代它,但对于那些既存项目或产品,使用新框架重构的代价未必能找到 ...
- .NET Core开发日志——HttpClientFactory
当需要向某特定URL地址发送HTTP请求并得到相应响应时,通常会用到HttpClient类.该类包含了众多有用的方法,可以满足绝大多数的需求.但是如果对其使用不当时,可能会出现意想不到的事情. 博客园 ...
- .NET Core开发日志——从ASP.NET Core Module到KestrelServer
ASP.NET Core程序现在变得如同控制台(Console)程序一般,同样通过Main方法启动整个应用.而Main方法要做的事情很简单,创建一个WebHostBuilder类,调用其Build方法 ...
- .NET Core开发日志——Runtime IDentifier
.NET Core对于传统.NET开发人员而言是既熟悉又陌生的新平台,所以有时遇上出乎意料的事情也纯属正常情况.这时只需点耐心,多查查资料,努力找到原因,也未尝不是件有意义的体验. 比如当建完一个最简 ...
- .NET Core开发日志——OData
简述 OData,即Open Data Protocol,是由微软在2007年推出的一款开放协议,旨在通过简单.标准的方式创建和使用查询式及交互式RESTful API. 类库 在.NET Core中 ...
- .NET Core开发日志——结构化日志
在.NET生态圈中,最早被广泛使用的日志库可能是派生自Java世界里的Apache log4net.而其后来者,莫过于NLog.Nlog与log4net相比,有一项较显著的优势,它支持结构化日志. 结 ...
- .NET Core开发日志——Linux版本的SQL Server
SQL Server 2017版本已经可以在Linux系统上安装,但我在尝试.NET Core跨平台开发的时候使用的是Mac系统,所以这里记录了在Mac上安装SQL Server的过程. 最新的SQL ...
最新文章
- 哈希(Hash)算法是一种单向密码体制(它是一个从明文到密文的不可逆的映射只有加密过程没有解密过程)
- Facebook Messenger月用户数不断攀升 突破12亿
- 【学术相关】中国霸榜AI顶会,但引用量最低!最新斯坦福AI指数出炉!
- ajax jq 图片上传请求头_Jquery ajaxsubmit上传图片实现代码
- 中国进口消费市场研究报告2020
- GTK的.NET的函数库 GTK#
- ubuntu+intellij IDEA+android环境配置
- lammps教程:NEMD方法计算热导率公式详解
- windows10怎么卸载计算机,win10易升,详细教您如何彻底卸载删除win10易升
- 《统计决策论及贝叶斯分析》
- AQS框架原文翻译 - The java.util.concurrent Synchronizer Framework
- 算法复杂性分析及运算规则证明(一)
- 网站被攻击了,接入CDN防护,源IP是否需要修改
- 拓商:拼多多客服回复慢,到底应该怎么解决?
- nodemcu 自建服务器,NodeMCU入门(4):搭建Web服务器,配置网络连接(示例代码)
- linux下open函数用法,linux下open函数和creat函数
- Geany文本编辑器
- 在线教你如何设计个性好看的POP字体?
- VC、C++彩信接口开发经验及具体开发实现
- Oracle gsd服务是什么,oracle11gRAC的oc4j和gsd服务都处于offline状态
热门文章
- 第十届蓝桥杯省赛JavaB组G_外卖店优先级
- 大学有python专业吗-那个选错专业的大学生,后来去干嘛了?
- vue中调用百度地图api
- 你以为面试官问的是Vue,其实他想问……
- c语言,通过for循环计算1+1/2+1/3+……+1/100的值
- CET-6 | 2018年 六级真题『翻译』语句
- Cisco PT模拟实验(10) 路由器的基本配置
- 分享一个免费清理苹果电脑Mac磁盘空间方法
- IxEdit傻瓜式JavaScript开发工具(附下载、汉化版、视频教程)
- 图书馆管理系统应用程序说明书