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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章