文档目录

本节内容:

简介

OData在odata.org上的定义是:“一个开放的协议,允许创建和使用可查询、可互操作的RESTful api的简单的标准方式”。你可以在ABP里使用OData,Abp.Web.Api.OData的nuget包简化了它的使用方式。

安装

安装Nuget包

在我们的WebApi项目里,先安装Abp.Web.api.Odata的nuget包:

  1. Install-Package Abp.Web.Api.OData

设置模块依赖

在我们的模块上设置对AbpWebApiOdataModule的依赖,例如:

  1. [DependsOn(typeof(AbpWebApiODataModule))]
  2. public class MyProjectWebApiModule : AbpModule
  3. {
  4. ...
  5. }

查看模块系统更好地理解模块依赖。

配置你的实体

OData需要声明哪个实体作为它的资源,我们应当在我们模块的PreInitialize方法里指定,如下所示:

  1. [DependsOn(typeof(AbpWebApiODataModule))]
  2. public class MyProjectWebApiModule : AbpModule
  3. {
  4. public override void PreInitialize()
  5. {
  6. var builder = Configuration.Modules.AbpWebApiOData().ODataModelBuilder;
  7.  
  8. //Configure your entities here...
  9. builder.EntitySet<Person>("Persons");
  10. }
  11.  
  12. ...
  13. }

此处,我们ODataModelBuilder的引用,并给它设置了Person实体,类似地,你可以使用EntitySet来添加其它实体,查看OData文档获取更多信息。

创建控制器

Abp.Web.Api.OData的nuget包包括了AbpODataEntityController基类(它扩展了标准的ODataController),用它可更容易地创建你自己的控制器,如下是一个为Person实体创建一个OData端点的例子:

  1. public class PersonsController : AbpODataEntityController<Person>
  2. {
  3. public PersonsController(IRepository<Person> repository)
  4. : base(repository)
  5. {
  6. }
  7. }

这很简单,AbpODataEntityController的所有方法都是virtual,也就是说你可以重写Get、Post、Put、Patch、Delete和其它Action来添加自己的逻辑。

示例

这里我们列几个请求上面定义的控制器的基本的例子,假设应用工作在http://localhost:61842上,因为OData是一个标准的协议,你可以很容易地在网页上找到更深入的例子。

获取实体列表

获取所有person。

请求

  1. GET http://localhost:61842/odata/Persons

响应

  1. {
  2. "@odata.context":"http://localhost:61842/odata/$metadata#Persons","value":[
  3. {
  4. "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":
  5. },{
  6. "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":
  7. }
  8. ]
  9. }

获取单个实体

获取Id=2的person。

请求

  1. GET http://localhost:61842/odata/Persons(2)

响应

  1. {
  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":
  3. }

获取单个实体及导航属性

获取Id=1的person包含它的电话号码。

请求

  1. GET http://localhost:61842/odata/Persons(1)?$expand=Phones

响应

  1. {
  2. "@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":[
  3. {
  4. "PersonId":,"Type":"Mobile","Number":"","CreationTime":"2015-11-07T20:12:39.363+03:00","CreatorUserId":null,"Id":
  5. },{
  6. "PersonId":,"Type":"Mobile","Number":"","CreationTime":"2015-11-07T20:12:39.363+03:00","CreatorUserId":null,"Id":
  7. }
  8. ]
  9. }

查询

这里列举一个稍微复杂点的查询,包含过滤,排序和获取最前面2条结果。

请求

  1. GET http://localhost:61842/odata/Persons?$filter=Name eq 'Douglas Adams'&$orderby=CreationTime&$top=2

响应 

  1. {
  2. "@odata.context":"http://localhost:61842/odata/$metadata#Persons","value":[
  3. {
  4. "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":
  5. },{
  6. "Name":"Douglas Adams","IsDeleted":false,"DeleterUserId":null,"DeletionTime":null,"LastModificationTime":null,"LastModifierUserId":null,"CreationTime":"2016-01-12T20:29:03+02:00","CreatorUserId":null,"Id":
  7. }
  8. ]
  9. }

OData支持分页,排序,过滤,投射等更多,请查阅它自己的文档

创建一个新实体

接下来的例子,我们创建一个新person。

请求

  1. POST http://localhost:61842/odata/Persons
  2.  
  3. {
  4. Name: "Galileo Galilei"
  5. }

此处,“Content-Type"头是”application/json“。

响应

  1. {
  2. "@odata.context": "http://localhost:61842/odata/$metadata#Persons/$entity",
  3. "Name": "Galileo Galilei",
  4. "IsDeleted": false,
  5. "DeleterUserId": null,
  6. "DeletionTime": null,
  7. "LastModificationTime": null,
  8. "LastModifierUserId": null,
  9. "CreationTime": "2016-01-12T20:36:04.1628263+02:00",
  10. "CreatorUserId": null,
  11. "Id":
  12. }

如果我们再次获取列表,我们可以看到这个新person,也OData支持更新或删除一个已经存在的实体。

获取元数据

我们可以获取实体的元数据,如接下来的例子所示。

请求

  1. GET http://localhost:61842/odata/$metadata

响应

  1. <?xml version="1.0" encoding="utf-8"?>
  2.  
  3. <edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
  4.  
  5. <edmx:DataServices>
  6.  
  7. <Schema Namespace="AbpODataDemo.People" xmlns="http://docs.oasis-open.org/odata/ns/edm">
  8.  
  9. <EntityType Name="Person">
  10.  
  11. <Key>
  12.  
  13. <PropertyRef Name="Id" />
  14.  
  15. </Key>
  16.  
  17. <Property Name="Name" Type="Edm.String" Nullable="false" />
  18.  
  19. <Property Name="IsDeleted" Type="Edm.Boolean" Nullable="false" />
  20.  
  21. <Property Name="DeleterUserId" Type="Edm.Int64" />
  22.  
  23. <Property Name="DeletionTime" Type="Edm.DateTimeOffset" />
  24.  
  25. <Property Name="LastModificationTime" Type="Edm.DateTimeOffset" />
  26.  
  27. <Property Name="LastModifierUserId" Type="Edm.Int64" />
  28.  
  29. <Property Name="CreationTime" Type="Edm.DateTimeOffset" Nullable="false" />
  30.  
  31. <Property Name="CreatorUserId" Type="Edm.Int64" />
  32.  
  33. <Property Name="Id" Type="Edm.Int32" Nullable="false" />
  34.  
  35. <NavigationProperty Name="Phones" Type="Collection(AbpODataDemo.People.Phone)" />
  36.  
  37. </EntityType>
  38.  
  39. <EntityType Name="Phone">
  40.  
  41. <Key>
  42.  
  43. <PropertyRef Name="Id" />
  44.  
  45. </Key>
  46.  
  47. <Property Name="PersonId" Type="Edm.Int32" />
  48.  
  49. <Property Name="Type" Type="AbpODataDemo.People.PhoneType" Nullable="false" />
  50.  
  51. <Property Name="Number" Type="Edm.String" Nullable="false" />
  52.  
  53. <Property Name="CreationTime" Type="Edm.DateTimeOffset" Nullable="false" />
  54.  
  55. <Property Name="CreatorUserId" Type="Edm.Int64" />
  56.  
  57. <Property Name="Id" Type="Edm.Int32" Nullable="false" />
  58.  
  59. <NavigationProperty Name="Person" Type="AbpODataDemo.People.Person">
  60.  
  61. <ReferentialConstraint Property="PersonId" ReferencedProperty="Id" />
  62.  
  63. </NavigationProperty>
  64.  
  65. </EntityType>
  66.  
  67. <EnumType Name="PhoneType">
  68.  
  69. <Member Name="Unknown" Value="" />
  70.  
  71. <Member Name="Mobile" Value="" />
  72.  
  73. <Member Name="Home" Value="" />
  74.  
  75. <Member Name="Office" Value="" />
  76.  
  77. </EnumType>
  78.  
  79. </Schema>
  80.  
  81. <Schema Namespace="Default" xmlns="http://docs.oasis-open.org/odata/ns/edm">
  82.  
  83. <EntityContainer Name="Container">
  84.  
  85. <EntitySet Name="Persons" EntityType="AbpODataDemo.People.Person" />
  86.  
  87. </EntityContainer>
  88.  
  89. </Schema>
  90.  
  91. </edmx:DataServices>
  92.  
  93. </edmx:Edmx>

元数据用来查看服务信息。

示例项目

你可以从https://github.com/aspnetboilerplate/sample-odata上获取这个示例项目的源代码。

ABP框架 - OData 集成的更多相关文章

  1. ABP官方文档翻译 5.3 OData集成

    OData集成 介绍 安装 安装Nuget包 设置模块依赖 配置实体 创建控制器 配置 示例 获取实体列表 Request Response 获取单个实体 Request Response 使用导航属 ...

  2. ABP框架中短信发送处理,包括阿里云短信和普通短信商的短信发送集成

    在一般的系统中,往往也有短信模块的需求,如动态密码的登录,系统密码的找回,以及为了获取用户手机号码的短信确认等等,在ABP框架中,本身提供了对邮件.短信的基础支持,那么只需要根据自己的情况实现对应的接 ...

  3. ABP框架 - 集成OWIN

    文档目录 如果你在应用中同时使用Asp.net Mvc和Asp.net Web API,你需要在你的项目里添加Abp.Owin的nuget包(通常是Web项目)然后在你的OWIN的Startup文件里 ...

  4. 中小研发团队架构实践之生产环境诊断工具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如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...

  5. 一、ABP框架框架摘要

    ABP框架几点说明: 一.什么是ABP ABP是一个建立在最新的ASP.NET的MVC和Web API技术的应用框架.它可以很容易地使用依赖注入.日志记录.验证.异常处理.本地化等,也使用流行的框架和 ...

  6. [译]ABP框架使用AngularJs,ASP.NET MVC,Web API和EntityFramework构建N层架构的SPA应用程序

    本文转自:http://www.skcode.cn/archives/281 本文演示ABP框架如何使用AngularJs,ASP.NET MVC,Web API 和EntityFramework构建 ...

  7. ABP框架详解(五)Navigation

    ABP框架中的Navigation功能用于管理业务系统中所有可用的菜单导航控件,通常在业务系统的首页会有一个全局性的导航菜单,JD商城,天猫,猪八戒网莫不如是.所以为方便起见,Navigation功能 ...

  8. 老周的ABP框架系列教程 -》 一、框架理论初步学习

    老周的ABP框架系列教程 -- 一.框架理论初步学习   1. ABP框架的来源与作用简介 1.1  简介 1.1.1       ABP框架全称为"ASP.NET Boilerplate ...

  9. OData 集成

    OData 集成 文档目录 本节内容: 简介 安装 安装Nuget包 设置模块依赖 配置你的实体 创建控制器 示例 获取实体列表 请求 响应 获取单个实体 请求 响应 获取单个实体及导航属性 请求 响 ...

随机推荐

  1. Shell替换

    如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. #!/bin/bash a= echo -e "Value of a is ...

  2. H5坦克大战之【画出坦克】

    今天是个特殊的日子,圣诞节,也是周末,在这里先祝大家圣诞快乐!喜庆的日子,我们可以稍微放松一下,扯一扯昨天雷霆对战凯尔特人的比赛,这场比赛大威少又双叒叕拿下三双,而且是一个45+11+11的超级三双, ...

  3. 修改eclipse皮肤

    习惯了vim黑色背景的程序猿们想必用eclipse时会倍感的不适应吧,不过没关系,因为eclipse的皮肤是可以自己定制的! 下面是我电脑上的eclipse界面,看到这个是不是找回了vim的感觉呢? ...

  4. ASP.NET Core 中文文档 第四章 MVC(4.1)Controllers, Actions 和 Action Results

    原文:Controllers, Actions, and Action Results 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:许登洋(Seay) Action 和 acti ...

  5. 图解Spark API

    初识spark,需要对其API有熟悉的了解才能方便开发上层应用.本文用图形的方式直观表达相关API的工作特点,并提供了解新的API接口使用的方法.例子代码全部使用python实现. 1. 数据源准备 ...

  6. linux常用查看硬件设备信息命令

    转载:http://blog.chinaunix.net/uid-26782198-id-3242120.html # uname -a               # 查看内核/操作系统/CPU信息 ...

  7. OpenSUSE下编译安装OpenFoam

    在不是Ubuntu系统下安装OpenFoam,需要采用编译安装的方式.以下以OpenSuSE为例进行编译安装. 1 软件包准备 需要下载两个程序包: OpenFOAM-4.x-version-4.1. ...

  8. JavaScript中undefined与null的区别

    通常情况下, 当我们试图访问某个不存在的或者没有赋值的变量时,就会得到一个undefined值.Javascript会自动将声明是没有进行初始化的变量设为undifined. 如果一个变量根本不存在会 ...

  9. 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)

    前言     但凡一个略有规模的项目都需要一个持续集成环境的支撑,为什么需要持续集成环境,我们来看一个例子.假如一个项目,由A.B两位程序员来协作开发,A负责前端模块,B负责后端模块,前端依赖后端.A ...

  10. ABP源码分析四:Configuration

    核心模块的配置 Configuration是ABP中设计比较巧妙的地方.其通过AbpStartupConfiguration,Castle的依赖注入,Dictionary对象和扩展方法很巧妙的实现了配 ...