在 PDC09 期間,Microsoft WCF 數(shù)據(jù)服務(wù)團(tuán)隊(duì)(以前稱為 ADO.NET 數(shù)據(jù)服務(wù)團(tuán)隊(duì))首次推出 OData,即開放數(shù)據(jù)協(xié)議。這一消息是在會(huì)議第二天的主題演講中宣布的,但實(shí)際上 OData 早就開始了。自從 Microsoft .NET Framework 3.5 SP1 中提供 ADO.NET 數(shù)據(jù)服務(wù)以來,熟悉 ADO.NET 數(shù)據(jù)服務(wù)的用戶已經(jīng)使用 OData 作為數(shù)據(jù)傳輸協(xié)議開發(fā)基于資源的應(yīng)用程序。本文將介紹富 Internet 應(yīng)用程序 (RIA) 的開發(fā)人員如何使用 OData 以及使用 OData 的優(yōu)勢。
開放數(shù)據(jù)協(xié)議(Open Data Protocol,簡稱OData),是一種描述怎么創(chuàng)建和訪問Restful服務(wù)的oasis標(biāo)準(zhǔn)。
1、協(xié)議的組成部分?
答:① 核心協(xié)議:主要定義了開放數(shù)據(jù)協(xié)議的核心語義和行為; ② URL規(guī)范:URL規(guī)范主要定義了一系列推薦(非強(qiáng)制)采用的構(gòu)建用于訪問OData服務(wù)中的數(shù)據(jù)和模型的URL的規(guī)則; ③ 通用格式定義語言(CSDL):OData服務(wù)的數(shù)據(jù)模型是通過EDM(實(shí)體數(shù)據(jù)模型)來定義的。通用格式定義語言(Common Schema Definition Language (CSDL))定義了OData服務(wù)的EDM模型的一種XML格式的表現(xiàn)形式; ④ 擴(kuò)展的巴科斯范式(ABNF):ABNF定義了構(gòu)建OData請求和響應(yīng)URL的巴科斯范式。 oData是一個(gè)協(xié)議標(biāo)準(zhǔn),我們只需要按照這個(gè)協(xié)議或者標(biāo)準(zhǔn)生產(chǎn)組件,那么這個(gè)組件就可以方便的和其他組件集成協(xié)作。
2、什么是restful?
答:【restful】是一種網(wǎng)絡(luò)應(yīng)用程序的設(shè)計(jì)風(fēng)格和開發(fā)方式,基于http,可以使用xml格式定義或者Json格式定義。 【restful】適用于移動(dòng)互聯(lián)網(wǎng)廠商作為業(yè)務(wù)使用接口的場景。實(shí)現(xiàn)第三方ott調(diào)用移動(dòng)互聯(lián)網(wǎng)資源的功能,動(dòng)作類型為增刪改所調(diào)用的資源。
OData 生態(tài)系統(tǒng)
該協(xié)議定義了可以操作的資源和方法,以及可以對這些資源執(zhí)行的操作(GET、PUT、POST、MERGE 和 DELETE,分別對應(yīng)著讀取、創(chuàng)建、替換、合并和刪除)。
OData 的長期目標(biāo)是為每種主流技術(shù)、編程語言和平臺(tái)都打造一個(gè) OData 客戶端庫,以便每個(gè)客戶端應(yīng)用程序都可以使用豐富的 OData 源。OData 的生產(chǎn)者和使用者共同構(gòu)成了 OData“生態(tài)系統(tǒng)”。
3、oData與restful是什么關(guān)系?
答:現(xiàn)在我們了解到了,restful是一個(gè)前端與后端交互的應(yīng)用協(xié)議,而oData是restful實(shí)現(xiàn)的一種方式。
SharePoint 站點(diǎn)的服務(wù)文檔
OData URI 約定
服務(wù)文檔列出了服務(wù)提供的實(shí)體集。請記住,您可以使用強(qiáng)大的 URI 語法(是 OData 協(xié)議的可選部分)來訪問此服務(wù)中的資源。讓我們快速了解一下此服務(wù)的 URI 語法。若要訪問每個(gè)實(shí)體集的源,您需要將實(shí)體集的名稱附加到服務(wù)的基本 URI 中,例如 http://myhost/Listings.svc/Properties 將指向 Properties 實(shí)體集中的一組實(shí)體。
還可以使用單個(gè)實(shí)體的鍵值來指向該實(shí)體,例如 URI http://myhost/ Listings.svc/Properties(0) 將指向 ID = 0 的房產(chǎn)。您可以將關(guān)系名稱附加到 URI 末尾,以指向此實(shí)體與其他實(shí)體或?qū)嶓w集的關(guān)系,因此 http://myhost/ Listings.svc/Properties(0)/Listings 將指向與 ID = 0 的房產(chǎn)實(shí)體相關(guān)的一組銷售清單。使用此語法,可以瀏覽關(guān)系的很多層級(jí)。
URI 還定義了很多可以附加到 URI 的查詢選項(xiàng),以便在一定程度上修改基本查詢,其中每個(gè)查詢選項(xiàng)都定義為名稱/值對。例如,附加查詢選項(xiàng) $top=10 后,就將查詢限制為僅包含結(jié)果中的前 10 個(gè)實(shí)體。圖 4 列出了 URI 語法中所有可用的查詢選項(xiàng)。
| $top=n | 將查詢限制為前 n 個(gè)實(shí)體。 |
|---|---|
| $skip=n | 跳過集中的前 n 個(gè)實(shí)體。 |
| $inlinecount=allpages | 在結(jié)果中包含集中所有實(shí)體的計(jì)數(shù)。 |
| $filter=<表達(dá)式> | 可以用表達(dá)式限制查詢返回的結(jié)果(例如:$filter=Status eq 'Available' 將結(jié)果限制為具有 Status 屬性且此屬性值為 Available 的實(shí)體)。 |
| $orderby=<表達(dá)式> | 按照實(shí)體的一組屬性對結(jié)果進(jìn)行排序 |
| $select=<表達(dá)式> | 指定要返回的實(shí)體的屬性子集。 |
| $format | 指定要返回的源的格式(ATOM 或 JSON)。此選項(xiàng)在 WCF 數(shù)據(jù)服務(wù)中不受支持。 |
從 SharePoint 提供數(shù)據(jù)
在前述部分中,我為您展示了如何提供關(guān)系數(shù)據(jù)庫中存儲(chǔ)的數(shù)據(jù),以及房地產(chǎn)網(wǎng)站的房產(chǎn)和銷售清單信息。讓我們假設(shè)我還有負(fù)責(zé)出售房產(chǎn)的代理人信息,但這些數(shù)據(jù)存儲(chǔ)在 SharePoint 站點(diǎn)中。Microsoft SharePoint 2010 提供了相應(yīng)功能,可以將所有列表和列表中的文檔作為 OData 源提供。這非常適合該房地產(chǎn)網(wǎng)站,因?yàn)檫@意味著該公司員工輸入的代理人信息可作為 OData 源使用,可以包含在我構(gòu)建的銷售清單應(yīng)用程序中。使用 SharePoint 接口負(fù)責(zé)輸入和更新此數(shù)據(jù)的用戶不必更改其工作流程來適應(yīng)我的應(yīng)用程序。輸入到公司 SharePoint 站點(diǎn)的數(shù)據(jù)在即將創(chuàng)建的 Listings 應(yīng)用程序中實(shí)時(shí)可用。
在 SharePoint 系統(tǒng)中安裝適用于 .NET Framework 3.5 SP1 的 ADO.NET 數(shù)據(jù)服務(wù)更新后,對于每個(gè)將清單數(shù)據(jù)作為 OData 源提供的站點(diǎn)來說,將有一個(gè)新的 HTTP 端點(diǎn)可以使用。由于 OData 源要使用 HTTP 進(jìn)行訪問,因此使用 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' | 根據(jù)表達(dá)式的狀態(tài)返回結(jié)果(返回ProductName 等于Tofu的Products) |
| ****$orderby**** | http://localhost:8090/api/Meetings?$orderby=ProductName | 根據(jù)結(jié)果排序(根據(jù)ProductName列排序) |
| ****$skip**** | http://localhost:8090/api/Meetings?$skip=10 | 越過結(jié)果中的n條數(shù)據(jù),常用于分頁 |
| ****$top**** | http://localhost:8090/api/Meetings?$top=10 | 返回結(jié)果中的前n條記錄,常用于分頁 |
| ****$select**** |
http://localhost:8090/api/Meetings? |
選擇需要返回的屬性 |
| ****$expand**** | http://localhost:8090/api/Meetings?$expand=Supplier | 返回Products中包含的導(dǎo)航屬性(關(guān)聯(lián)屬性)Supplier |
| ****$inlinecount**** | http://localhost:8090/api/Meetings?$inlinecount=allpages | 向服務(wù)器獲取符合條件的資源總數(shù)(分頁的total值) |
函數(shù)操作:
contains(包含)
$filter=contains(Name,'sap') Name中包含”sap”的所有信息,這樣就達(dá)到了模糊查詢的效果,只輸入其中的幾個(gè)字符便可查到所有包含這幾個(gè)字符的信息;
not contains(不包含)
$filter=not contains(Name,'sap') Name中不包含”sap”的所有信息,與contains效果相反;
startswith(以xx****開頭)
$filter=startswith(Name, 'sap') Name以”sap”開頭的所有信息;
endswith(以xx****結(jié)尾)
$filter=endswith(Name, 'sap') Name以”sap”結(jié)尾的所有信息;
length(字符長度)
$filter=length(Name) eq 10 Name中字符長度等于10的所有信息;
indexof(字符長度等于x****索引為n開始包含xx字符)
$filter=indexof(Name, 'sap') eq 10 Name從第11個(gè)字母開始包含”sap”的所有信息;
replace(替換)
$filter=replace(Name, 'a', 'p') eq 'sap' Name等于”sap”的信息中”a”被”p”替換;
substring(從第n個(gè)字符開始)
filter=substring(Name, 1, 2) eq 'sa' Name的第2個(gè)和第3個(gè)字符是”sa”的所有信息;
tolower(轉(zhuǎn)換為小寫)
$filter=tolower(Name) eq 'SAP' Name等于”SAP”的字符都轉(zhuǎn)換為小寫;
toupper(轉(zhuǎn)換為大寫)
$filter=toupper(Name) eq 'sap' Name等于”sap”的字符都轉(zhuǎn)換為大寫;
trim(去空格后)
$filter=length(trim(Name)) eq length(‘sap’) Name去掉空格后依舊等于”sap”的所有信息;
我們在學(xué)習(xí)SAPUI5的時(shí)候可以使用免費(fèi)的OData:
https://services.odata.org/V2/Northwind/Northwind.svc/
https://services.odata.org/V3/OData/OData.svc/
OData 比較運(yùn)算符 - eq、ne、gt、lt、ge 和 le
相等性運(yùn)算符:
eq:測試某個(gè)字段是否等于某個(gè)常量值ne:測試某個(gè)字段是否不等于某個(gè)常量值
范圍運(yùn)算符:
gt:測試某個(gè)字段是否大于某個(gè)常量值lt:測試某個(gè)字段是否小于某個(gè)常量值ge:測試某個(gè)字段是否大于或等于某個(gè)常量值le:測試某個(gè)字段是否小于或等于某個(gè)常量值