OData基础概念详解(Metadata, $select, $filter)

在博客《SAP Gateway与OData用法简介》中,简单介绍了SAP Gateway的部署方式和OData的使用方法。在本文中,将进一步介绍OData的基础概念,以及在OData中基础的Query操作。

1. OData概述

OData是Open Data Protocol的缩写,是一种基于REST的数据访问方式,该标准由微软发起,前三个版本1.0、2.0、3.0都是微软开放标准,第版本4.0于2014年在OASIS投票通过成为开放工业标准。

有关OData的的协议的详细介绍,可以访问www.odata.org 。

OData由两部分组成,也即“格式(format) + 协议(protocol)”。格式定义了如何描述数据,协议定义了如何操作数据。因此,可以将OData理解为一种“接口协议”,它规定了数据格式以及数据的操作标准。

OData服务广泛应用于各种场景的集成,在SAP产品中,SAP Fiori,SAP JAM,SAP Netwear Protal以及在SAP Cloud Platform上都广泛地使用了OData技术。

2. OData的演化历史

任何一种技术都不是凭空产生的,OData也是如此。RSS和Atom在某种程度上可以看做是OData的起源。

RSS是Really Simple Syndication的缩写,中文译为“简单信息聚合”。通常提起RSS,我们联想到的第一个词组就是RSS订阅,没错RSS主要适用于定义和描述一个相关的话题,以及与其有关的各种信息源。

举例:对于某一话题例如“SAP Cloud Platform”很感兴趣,你可以订阅SAP Community中标签为“SAP Cloud”的RSS源(RSS Feed),当在SAP Community中发布有关“SAP Cloud”这一话题的文章时,相关的信息便会通过RSS推送给你。

RSS中的这些数据都是标准的XML格式,是一种描述和同步网站内容的格式。可见,RSS是一种描述网站内容的方式

我们简单看一个RSS Feed的文件格式:

Feed中描述了一些元数据的信息例如Title,Link, ID,Updated的日期等等;一个Feed下可包含多条Entry,每一条Entry都代表在“SAP Cloud Platform”这一个标签下的一片具体博客的信息以及访问地址。

Atom是一种与RSS类似的信息聚合服务,但相比于RSS,Atom有更大的使用弹性。Atom中定义了Atom Publishing Protocol,使得用户可以操作以Atom格式存储数据的资源。这些操作包括:创建、编辑、读取、以及删除,且对应着标准HTTP中的GET,POST,PUT和DELTE操作。

Atom中的这些基础操作,被OData很好地继承了下来,并构建了OData的基础。

3. OData服务结构

OData的服务结构包括:

1)服务文档(Service Document):描述了OData Service中可用的数据的概览信息,也即OData中所含的Entity Set信息。

2)服务元结构文档(Service Metadata Document):在元结构文档中,描述了OData服务中的数据类型及其相关的属性,也即Entity TypeProperty

在以上两种文档中包含了:

1) 实体集合(Entity Set):等同于RSS中的Feed节点,是某一种信息的集合

2)   实体(Entity):等同于RSS中的Entry节点,描述了具体某一条目信息的内容 

3)   实体类型(Entity Type):表明实体的类型,每一个实体都对应一个Entity Type

4) 属性(Property): 实体具体的属性

5) 导航属性(Navigation Property):用于描述层级关系,例如Category - Sub-category这种关系

6) 关联(Association):描述关联关系

示例:可以访问以的OData的示例文件 - 

   # 访问OData的Service Document:https://services.odata.org/V3/Northwind/Northwind.svc/

   # 访问OData的Medata Document:https://services.odata.org/V3/Northwind/Northwind.svc/$metadata

   # 访问OData中具体的某一个Entity Set:https://services.odata.org/V3/Northwind/Northwind.svc/Products

   # 访问OData中具体的某一个Entiry: https://services.odata.org/V3/Northwind/Northwind.svc/Products(1)

   # 访问OData服务中,某一Entity的属性:https://services.odata.org/V3/Northwind/Northwind.svc/Products(1)/ProductID

OData结构小结:

    * 在OData的service document中可以看到所有的Entity Set;在OData的metadata document中可找到Entity Type和Property。

    * 如果想查看某一具体的实体,则直接在OData Service Document的URL后直接append上具体的实体名称即可,例如上例中的实体集合Customers;在实体集合中,每一条entry也即对应着一条数据的Entity。

4. OData的常用操作

1)统计总数:$count

举例:https://services.odata.org/V3/Northwind/Northwind.svc/Products/$count

2)限定范围:$top  $skip

举例:查询前2个product    https://services.odata.org/V3/Northwind/Northwind.svc/Products/?$top=2

举例:查询第3个和第4个:https://services.odata.org/V3/Northwind/Northwind.svc/Products/?$top=2&$skip=2

注意,使用查询符号时,要加,这个代表查询操作。

3)选取层级:$expand

举例:查询Products这个entiry set下的子集supplier  https://services.odata.org/V3/Northwind/Northwind.svc/Products?$expand=Supplier

4) JSON格式: $format=json

举例:https://services.odata.org/V3/Northwind/Northwind.svc/Products/?$top=2&$format=json

注意:Service document和metadata document只能以XML格式展示,其没有JSON格式。

5)选择部分属性:$select

举例:只选择product中的部分属性返回 https://services.odata.org/V3/Northwind/Northwind.svc/Products?$top=2&$select=ProductID,ProductName,SupplierID&$format=json

举例:限定子集Supplier中的数据

https://services.odata.org/V3/Northwind/Northwind.svc/Products?$expand=Supplier&$select=Supplier/SupplierID,Supplier/City&$format=json

6)选择符合条件的数据:$filter

举例:只选择product name = Chai的产品  https://services.odata.org/V3/Northwind/Northwind.svc/Products?$filter=ProductName%20eq%20%27Chai%27%20&$format=json

注意:其中20%代表空格,27%代表的单引号。当然可以也可直接输入$filter=ProductName eq 'Chai' , 在浏览器的地址栏中会自动进行转换。有关Filter的更多用法,可参见链接

5 小结

文章介绍了OData的历史演变过程和OData服务的基本结构,同时通过一些Open的OData service介绍了OData常用的一些操作。更多OData相关的信息可以访问www.odata.org。

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SAP-nkGavin

给作者赏杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值