在 PDC09 期间,Microsoft WCF 数据服务团队(以前称为 ADO.NET 数据服务团队)首次推出 OData,即开放数据协议。这一消息是在会议第二天的主题演讲中宣布的,但实际上 OData 早就开始了。自从 Microsoft .NET Framework 3.5 SP1 中提供 ADO.NET 数据服务以来,熟悉 ADO.NET 数据服务的用户已经使用 OData 作为数据传输协议开发基于资源的应用程序。本文将介绍富 Internet 应用程序 (RIA) 的开发人员如何使用 OData 以及使用 OData 的优势。
开放数据协议(Open Data Protocol,简称OData),是一种描述怎么创建和访问Restful服务的oasis标准。
1、协议的组成部分?
答:① 核心协议:主要定义了开放数据协议的核心语义和行为; ② URL规范:URL规范主要定义了一系列推荐(非强制)采用的构建用于访问OData服务中的数据和模型的URL的规则; ③ 通用格式定义语言(CSDL):OData服务的数据模型是通过EDM(实体数据模型)来定义的。通用格式定义语言(Common Schema Definition Language (CSDL))定义了OData服务的EDM模型的一种XML格式的表现形式; ④ 扩展的巴科斯范式(ABNF):ABNF定义了构建OData请求和响应URL的巴科斯范式。 oData是一个协议标准,我们只需要按照这个协议或者标准生产组件,那么这个组件就可以方便的和其他组件集成协作。
2、什么是restful?
答:【restful】是一种网络应用程序的设计风格和开发方式,基于http,可以使用xml格式定义或者Json格式定义。 【restful】适用于移动互联网厂商作为业务使用接口的场景。实现第三方ott调用移动互联网资源的功能,动作类型为增删改所调用的资源。
OData 生态系统
该协议定义了可以操作的资源和方法,以及可以对这些资源执行的操作(GET、PUT、POST、MERGE 和 DELETE,分别对应着读取、创建、替换、合并和删除)。
OData 的长期目标是为每种主流技术、编程语言和平台都打造一个 OData 客户端库,以便每个客户端应用程序都可以使用丰富的 OData 源。OData 的生产者和使用者共同构成了 OData“生态系统”。
3、oData与restful是什么关系?
答:现在我们了解到了,restful是一个前端与后端交互的应用协议,而oData是restful实现的一种方式。
SharePoint 站点的服务文档
OData URI 约定
服务文档列出了服务提供的实体集。请记住,您可以使用强大的 URI 语法(是 OData 协议的可选部分)来访问此服务中的资源。让我们快速了解一下此服务的 URI 语法。若要访问每个实体集的源,您需要将实体集的名称附加到服务的基本 URI 中,例如 http://myhost/Listings.svc/Properties 将指向 Properties 实体集中的一组实体。
还可以使用单个实体的键值来指向该实体,例如 URI http://myhost/ Listings.svc/Properties(0) 将指向 ID = 0 的房产。您可以将关系名称附加到 URI 末尾,以指向此实体与其他实体或实体集的关系,因此 http://myhost/ Listings.svc/Properties(0)/Listings 将指向与 ID = 0 的房产实体相关的一组销售清单。使用此语法,可以浏览关系的很多层级。
URI 还定义了很多可以附加到 URI 的查询选项,以便在一定程度上修改基本查询,其中每个查询选项都定义为名称/值对。例如,附加查询选项 $top=10 后,就将查询限制为仅包含结果中的前 10 个实体。图 4 列出了 URI 语法中所有可用的查询选项。
$top=n | 将查询限制为前 n 个实体。 |
---|---|
$skip=n | 跳过集中的前 n 个实体。 |
$inlinecount=allpages | 在结果中包含集中所有实体的计数。 |
$filter=<表达式> | 可以用表达式限制查询返回的结果(例如:$filter=Status eq 'Available' 将结果限制为具有 Status 属性且此属性值为 Available 的实体)。 |
$orderby=<表达式> | 按照实体的一组属性对结果进行排序 |
$select=<表达式> | 指定要返回的实体的属性子集。 |
$format | 指定要返回的源的格式(ATOM 或 JSON)。此选项在 WCF 数据服务中不受支持。 |
从 SharePoint 提供数据
在前述部分中,我为您展示了如何提供关系数据库中存储的数据,以及房地产网站的房产和销售清单信息。让我们假设我还有负责出售房产的代理人信息,但这些数据存储在 SharePoint 站点中。Microsoft SharePoint 2010 提供了相应功能,可以将所有列表和列表中的文档作为 OData 源提供。这非常适合该房地产网站,因为这意味着该公司员工输入的代理人信息可作为 OData 源使用,可以包含在我构建的销售清单应用程序中。使用 SharePoint 接口负责输入和更新此数据的用户不必更改其工作流程来适应我的应用程序。输入到公司 SharePoint 站点的数据在即将创建的 Listings 应用程序中实时可用。
在 SharePoint 系统中安装适用于 .NET Framework 3.5 SP1 的 ADO.NET 数据服务更新后,对于每个将清单数据作为 OData 源提供的站点来说,将有一个新的 HTTP 端点可以使用。由于 OData 源要使用 HTTP 进行访问,因此使用 Internet Explorer 即可查看。图 6 显示了 SharePoint 中代理人清单的源。
https://www.odata.org/getting-started/basic-tutorial/#filter
OData常用操作:
操作 | URL | 说明 |
---|---|---|
****$filter**** | http://localhost:8090/api/Meetings?$filter=ProductName eq 'Tofu' | 根据表达式的状态返回结果(返回ProductName 等于Tofu的Products) |
****$orderby**** | http://localhost:8090/api/Meetings?$orderby=ProductName | 根据结果排序(根据ProductName列排序) |
****$skip**** | http://localhost:8090/api/Meetings?$skip=10 | 越过结果中的n条数据,常用于分页 |
****$top**** | http://localhost:8090/api/Meetings?$top=10 | 返回结果中的前n条记录,常用于分页 |
****$select**** | http://localhost:8090/api/Meetings?select=ProductName,UnitPrice | 选择需要返回的属性 |
****$expand**** | http://localhost:8090/api/Meetings?$expand=Supplier | 返回Products中包含的导航属性(关联属性)Supplier |
****$inlinecount**** | http://localhost:8090/api/Meetings?$inlinecount=allpages | 向服务器获取符合条件的资源总数(分页的total值) |
函数操作:
contains(包含)
$filter=contains(Name,'sap') Name中包含”sap”的所有信息,这样就达到了模糊查询的效果,只输入其中的几个字符便可查到所有包含这几个字符的信息;
not contains(不包含)
$filter=not contains(Name,'sap') Name中不包含”sap”的所有信息,与contains效果相反;
startswith(以xx****开头)
$filter=startswith(Name, 'sap') Name以”sap”开头的所有信息;
endswith(以xx****结尾)
$filter=endswith(Name, 'sap') Name以”sap”结尾的所有信息;
length(字符长度)
$filter=length(Name) eq 10 Name中字符长度等于10的所有信息;
indexof(字符长度等于x****索引为n开始包含xx字符)
$filter=indexof(Name, 'sap') eq 10 Name从第11个字母开始包含”sap”的所有信息;
replace(替换)
$filter=replace(Name, 'a', 'p') eq 'sap' Name等于”sap”的信息中”a”被”p”替换;
substring(从第n个字符开始)
filter=substring(Name, 1, 2) eq 'sa' Name的第2个和第3个字符是”sa”的所有信息;
tolower(转换为小写)
$filter=tolower(Name) eq 'SAP' Name等于”SAP”的字符都转换为小写;
toupper(转换为大写)
$filter=toupper(Name) eq 'sap' Name等于”sap”的字符都转换为大写;
trim(去空格后)
$filter=length(trim(Name)) eq length(‘sap’) Name去掉空格后依旧等于”sap”的所有信息;
我们在学习SAPUI5的时候可以使用免费的OData:
https://services.odata.org/V2/Northwind/Northwind.svc/
https://services.odata.org/V3/OData/OData.svc/
OData 比较运算符 - eq
、ne
、gt
、lt
、ge
和 le
相等性运算符:
eq
:测试某个字段是否等于某个常量值ne
:测试某个字段是否不等于某个常量值
范围运算符:
gt
:测试某个字段是否大于某个常量值lt
:测试某个字段是否小于某个常量值ge
:测试某个字段是否大于或等于某个常量值le
:测试某个字段是否小于或等于某个常量值