ABP框架 - OData 集成
本节内容:
简介
OData在odata.org上的定义是:“一个开放的协议,允许创建和使用可查询、可互操作的RESTful api的简单的标准方式”。你可以在ABP里使用OData,Abp.Web.Api.OData的nuget包简化了它的使用方式。
安装
安装Nuget包
在我们的WebApi项目里,先安装Abp.Web.api.Odata的nuget包:
- Install-Package Abp.Web.Api.OData
设置模块依赖
在我们的模块上设置对AbpWebApiOdataModule的依赖,例如:
- [DependsOn(typeof(AbpWebApiODataModule))]
- public class MyProjectWebApiModule : AbpModule
- {
- ...
- }
查看模块系统更好地理解模块依赖。
配置你的实体
OData需要声明哪个实体作为它的资源,我们应当在我们模块的PreInitialize方法里指定,如下所示:
- [DependsOn(typeof(AbpWebApiODataModule))]
- public class MyProjectWebApiModule : AbpModule
- {
- public override void PreInitialize()
- {
- var builder = Configuration.Modules.AbpWebApiOData().ODataModelBuilder;
- //Configure your entities here...
- builder.EntitySet<Person>("Persons");
- }
- ...
- }
此处,我们ODataModelBuilder的引用,并给它设置了Person实体,类似地,你可以使用EntitySet来添加其它实体,查看OData文档获取更多信息。
创建控制器
Abp.Web.Api.OData的nuget包包括了AbpODataEntityController基类(它扩展了标准的ODataController),用它可更容易地创建你自己的控制器,如下是一个为Person实体创建一个OData端点的例子:
- public class PersonsController : AbpODataEntityController<Person>
- {
- public PersonsController(IRepository<Person> repository)
- : base(repository)
- {
- }
- }
这很简单,AbpODataEntityController的所有方法都是virtual,也就是说你可以重写Get、Post、Put、Patch、Delete和其它Action来添加自己的逻辑。
示例
这里我们列几个请求上面定义的控制器的基本的例子,假设应用工作在http://localhost:61842上,因为OData是一个标准的协议,你可以很容易地在网页上找到更深入的例子。
获取实体列表
获取所有person。
请求
- GET http://localhost:61842/odata/Persons
响应
- {
- "@odata.context":"http://localhost:61842/odata/$metadata#Persons","value":[
- {
- "Name":"Douglas Adams","IsDeleted":false,"DeleterUserId":null,"DeletionTime":null,"LastModificationTime":null,"LastModifierUserId":null,"CreationTime":"2015-11-07T20:12:39.363+03:00","CreatorUserId":null,"Id":
- },{
- "Name":"John Nash","IsDeleted":false,"DeleterUserId":null,"DeletionTime":null,"LastModificationTime":null,"LastModifierUserId":null,"CreationTime":"2015-11-07T20:12:39.363+03:00","CreatorUserId":null,"Id":
- }
- ]
- }
获取单个实体
获取Id=2的person。
请求
- GET http://localhost:61842/odata/Persons(2)
响应
- {
- "@odata.context":"http://localhost:61842/odata/$metadata#Persons/$entity","Name":"John Nash","IsDeleted":false,"DeleterUserId":null,"DeletionTime":null,"LastModificationTime":null,"LastModifierUserId":null,"CreationTime":"2015-11-07T20:12:39.363+03:00","CreatorUserId":null,"Id":
- }
获取单个实体及导航属性
获取Id=1的person包含它的电话号码。
请求
- GET http://localhost:61842/odata/Persons(1)?$expand=Phones
响应
- {
- "@odata.context":"http://localhost:61842/odata/$metadata#Persons/$entity","Name":"Douglas Adams","IsDeleted":false,"DeleterUserId":null,"DeletionTime":null,"LastModificationTime":null,"LastModifierUserId":null,"CreationTime":"2015-11-07T20:12:39.363+03:00","CreatorUserId":null,"Id":,"Phones":[
- {
- "PersonId":,"Type":"Mobile","Number":"","CreationTime":"2015-11-07T20:12:39.363+03:00","CreatorUserId":null,"Id":
- },{
- "PersonId":,"Type":"Mobile","Number":"","CreationTime":"2015-11-07T20:12:39.363+03:00","CreatorUserId":null,"Id":
- }
- ]
- }
查询
这里列举一个稍微复杂点的查询,包含过滤,排序和获取最前面2条结果。
请求
- GET http://localhost:61842/odata/Persons?$filter=Name eq 'Douglas Adams'&$orderby=CreationTime&$top=2
响应
- {
- "@odata.context":"http://localhost:61842/odata/$metadata#Persons","value":[
- {
- "Name":"Douglas Adams","IsDeleted":false,"DeleterUserId":null,"DeletionTime":null,"LastModificationTime":null,"LastModifierUserId":null,"CreationTime":"2015-11-07T20:12:39.363+03:00","CreatorUserId":null,"Id":
- },{
- "Name":"Douglas Adams","IsDeleted":false,"DeleterUserId":null,"DeletionTime":null,"LastModificationTime":null,"LastModifierUserId":null,"CreationTime":"2016-01-12T20:29:03+02:00","CreatorUserId":null,"Id":
- }
- ]
- }
OData支持分页,排序,过滤,投射等更多,请查阅它自己的文档。
创建一个新实体
接下来的例子,我们创建一个新person。
请求
- POST http://localhost:61842/odata/Persons
- {
- Name: "Galileo Galilei"
- }
此处,“Content-Type"头是”application/json“。
响应
- {
- "@odata.context": "http://localhost:61842/odata/$metadata#Persons/$entity",
- "Name": "Galileo Galilei",
- "IsDeleted": false,
- "DeleterUserId": null,
- "DeletionTime": null,
- "LastModificationTime": null,
- "LastModifierUserId": null,
- "CreationTime": "2016-01-12T20:36:04.1628263+02:00",
- "CreatorUserId": null,
- "Id":
- }
如果我们再次获取列表,我们可以看到这个新person,也OData支持更新或删除一个已经存在的实体。
获取元数据
我们可以获取实体的元数据,如接下来的例子所示。
请求
- GET http://localhost:61842/odata/$metadata
响应
- <?xml version="1.0" encoding="utf-8"?>
- <edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
- <edmx:DataServices>
- <Schema Namespace="AbpODataDemo.People" xmlns="http://docs.oasis-open.org/odata/ns/edm">
- <EntityType Name="Person">
- <Key>
- <PropertyRef Name="Id" />
- </Key>
- <Property Name="Name" Type="Edm.String" Nullable="false" />
- <Property Name="IsDeleted" Type="Edm.Boolean" Nullable="false" />
- <Property Name="DeleterUserId" Type="Edm.Int64" />
- <Property Name="DeletionTime" Type="Edm.DateTimeOffset" />
- <Property Name="LastModificationTime" Type="Edm.DateTimeOffset" />
- <Property Name="LastModifierUserId" Type="Edm.Int64" />
- <Property Name="CreationTime" Type="Edm.DateTimeOffset" Nullable="false" />
- <Property Name="CreatorUserId" Type="Edm.Int64" />
- <Property Name="Id" Type="Edm.Int32" Nullable="false" />
- <NavigationProperty Name="Phones" Type="Collection(AbpODataDemo.People.Phone)" />
- </EntityType>
- <EntityType Name="Phone">
- <Key>
- <PropertyRef Name="Id" />
- </Key>
- <Property Name="PersonId" Type="Edm.Int32" />
- <Property Name="Type" Type="AbpODataDemo.People.PhoneType" Nullable="false" />
- <Property Name="Number" Type="Edm.String" Nullable="false" />
- <Property Name="CreationTime" Type="Edm.DateTimeOffset" Nullable="false" />
- <Property Name="CreatorUserId" Type="Edm.Int64" />
- <Property Name="Id" Type="Edm.Int32" Nullable="false" />
- <NavigationProperty Name="Person" Type="AbpODataDemo.People.Person">
- <ReferentialConstraint Property="PersonId" ReferencedProperty="Id" />
- </NavigationProperty>
- </EntityType>
- <EnumType Name="PhoneType">
- <Member Name="Unknown" Value="" />
- <Member Name="Mobile" Value="" />
- <Member Name="Home" Value="" />
- <Member Name="Office" Value="" />
- </EnumType>
- </Schema>
- <Schema Namespace="Default" xmlns="http://docs.oasis-open.org/odata/ns/edm">
- <EntityContainer Name="Container">
- <EntitySet Name="Persons" EntityType="AbpODataDemo.People.Person" />
- </EntityContainer>
- </Schema>
- </edmx:DataServices>
- </edmx:Edmx>
元数据用来查看服务信息。
示例项目
你可以从https://github.com/aspnetboilerplate/sample-odata上获取这个示例项目的源代码。
ABP框架 - OData 集成的更多相关文章
- ABP官方文档翻译 5.3 OData集成
OData集成 介绍 安装 安装Nuget包 设置模块依赖 配置实体 创建控制器 配置 示例 获取实体列表 Request Response 获取单个实体 Request Response 使用导航属 ...
- ABP框架中短信发送处理,包括阿里云短信和普通短信商的短信发送集成
在一般的系统中,往往也有短信模块的需求,如动态密码的登录,系统密码的找回,以及为了获取用户手机号码的短信确认等等,在ABP框架中,本身提供了对邮件.短信的基础支持,那么只需要根据自己的情况实现对应的接 ...
- ABP框架 - 集成OWIN
文档目录 如果你在应用中同时使用Asp.net Mvc和Asp.net Web API,你需要在你的项目里添加Abp.Owin的nuget包(通常是Web项目)然后在你的OWIN的Startup文件里 ...
- 中小研发团队架构实践之生产环境诊断工具WinDbg 三分钟学会.NET微服务之Polly 使用.Net Core+IView+Vue集成上传图片功能 Fiddler原理~知多少? ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) C#程序中设置全局代理(Global Proxy) WCF 4.0 使用说明 如何在IIS上发布,并能正常访问
中小研发团队架构实践之生产环境诊断工具WinDbg 生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器.调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...
- 一、ABP框架框架摘要
ABP框架几点说明: 一.什么是ABP ABP是一个建立在最新的ASP.NET的MVC和Web API技术的应用框架.它可以很容易地使用依赖注入.日志记录.验证.异常处理.本地化等,也使用流行的框架和 ...
- [译]ABP框架使用AngularJs,ASP.NET MVC,Web API和EntityFramework构建N层架构的SPA应用程序
本文转自:http://www.skcode.cn/archives/281 本文演示ABP框架如何使用AngularJs,ASP.NET MVC,Web API 和EntityFramework构建 ...
- ABP框架详解(五)Navigation
ABP框架中的Navigation功能用于管理业务系统中所有可用的菜单导航控件,通常在业务系统的首页会有一个全局性的导航菜单,JD商城,天猫,猪八戒网莫不如是.所以为方便起见,Navigation功能 ...
- 老周的ABP框架系列教程 -》 一、框架理论初步学习
老周的ABP框架系列教程 -- 一.框架理论初步学习 1. ABP框架的来源与作用简介 1.1 简介 1.1.1 ABP框架全称为"ASP.NET Boilerplate ...
- OData 集成
OData 集成 文档目录 本节内容: 简介 安装 安装Nuget包 设置模块依赖 配置你的实体 创建控制器 示例 获取实体列表 请求 响应 获取单个实体 请求 响应 获取单个实体及导航属性 请求 响 ...
随机推荐
- Shell替换
如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. #!/bin/bash a= echo -e "Value of a is ...
- H5坦克大战之【画出坦克】
今天是个特殊的日子,圣诞节,也是周末,在这里先祝大家圣诞快乐!喜庆的日子,我们可以稍微放松一下,扯一扯昨天雷霆对战凯尔特人的比赛,这场比赛大威少又双叒叕拿下三双,而且是一个45+11+11的超级三双, ...
- 修改eclipse皮肤
习惯了vim黑色背景的程序猿们想必用eclipse时会倍感的不适应吧,不过没关系,因为eclipse的皮肤是可以自己定制的! 下面是我电脑上的eclipse界面,看到这个是不是找回了vim的感觉呢? ...
- ASP.NET Core 中文文档 第四章 MVC(4.1)Controllers, Actions 和 Action Results
原文:Controllers, Actions, and Action Results 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:许登洋(Seay) Action 和 acti ...
- 图解Spark API
初识spark,需要对其API有熟悉的了解才能方便开发上层应用.本文用图形的方式直观表达相关API的工作特点,并提供了解新的API接口使用的方法.例子代码全部使用python实现. 1. 数据源准备 ...
- linux常用查看硬件设备信息命令
转载:http://blog.chinaunix.net/uid-26782198-id-3242120.html # uname -a # 查看内核/操作系统/CPU信息 ...
- OpenSUSE下编译安装OpenFoam
在不是Ubuntu系统下安装OpenFoam,需要采用编译安装的方式.以下以OpenSuSE为例进行编译安装. 1 软件包准备 需要下载两个程序包: OpenFOAM-4.x-version-4.1. ...
- JavaScript中undefined与null的区别
通常情况下, 当我们试图访问某个不存在的或者没有赋值的变量时,就会得到一个undefined值.Javascript会自动将声明是没有进行初始化的变量设为undifined. 如果一个变量根本不存在会 ...
- 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)
前言 但凡一个略有规模的项目都需要一个持续集成环境的支撑,为什么需要持续集成环境,我们来看一个例子.假如一个项目,由A.B两位程序员来协作开发,A负责前端模块,B负责后端模块,前端依赖后端.A ...
- ABP源码分析四:Configuration
核心模块的配置 Configuration是ABP中设计比较巧妙的地方.其通过AbpStartupConfiguration,Castle的依赖注入,Dictionary对象和扩展方法很巧妙的实现了配 ...