在 PDC09 期間惧互,Microsoft WCF 數(shù)據(jù)服務團隊(以前稱為 ADO.NET 數(shù)據(jù)服務團隊)首次推出 OData,即開放數(shù)據(jù)協(xié)議蛾方。這一消息是在會議第二天的主題演講中宣布的夹供,但實際上 OData 早就開始了袭厂。自從 Microsoft .NET Framework 3.5 SP1 中提供 ADO.NET 數(shù)據(jù)服務以來,熟悉 ADO.NET 數(shù)據(jù)服務的用戶已經(jīng)使用 OData 作為數(shù)據(jù)傳輸協(xié)議開發(fā)基于資源的應用程序媳纬。本文將介紹富 Internet 應用程序 (RIA) 的開發(fā)人員如何使用 OData 以及使用 OData 的優(yōu)勢双肤。
開放數(shù)據(jù)協(xié)議(Open Data Protocol施掏,簡稱OData),是一種描述怎么創(chuàng)建和訪問Restful服務的oasis標準茅糜。
1七芭、協(xié)議的組成部分?
答:① 核心協(xié)議:主要定義了開放數(shù)據(jù)協(xié)議的核心語義和行為限匣; ② URL規(guī)范:URL規(guī)范主要定義了一系列推薦(非強制)采用的構建用于訪問OData服務中的數(shù)據(jù)和模型的URL的規(guī)則抖苦; ③ 通用格式定義語言(CSDL):OData服務的數(shù)據(jù)模型是通過EDM(實體數(shù)據(jù)模型)來定義的。通用格式定義語言(Common Schema Definition Language (CSDL))定義了OData服務的EDM模型的一種XML格式的表現(xiàn)形式米死; ④ 擴展的巴科斯范式(ABNF):ABNF定義了構建OData請求和響應URL的巴科斯范式锌历。 oData是一個協(xié)議標準,我們只需要按照這個協(xié)議或者標準生產(chǎn)組件峦筒,那么這個組件就可以方便的和其他組件集成協(xié)作究西。
2、什么是restful物喷?
答:【restful】是一種網(wǎng)絡應用程序的設計風格和開發(fā)方式卤材,基于http,可以使用xml格式定義或者Json格式定義峦失。 【restful】適用于移動互聯(lián)網(wǎng)廠商作為業(yè)務使用接口的場景扇丛。實現(xiàn)第三方ott調(diào)用移動互聯(lián)網(wǎng)資源的功能,動作類型為增刪改所調(diào)用的資源尉辑。
OData 生態(tài)系統(tǒng)
該協(xié)議定義了可以操作的資源和方法帆精,以及可以對這些資源執(zhí)行的操作(GET、PUT隧魄、POST卓练、MERGE 和 DELETE巩趁,分別對應著讀取钥庇、創(chuàng)建、替換寝凌、合并和刪除)狮含。
OData 的長期目標是為每種主流技術顽悼、編程語言和平臺都打造一個 OData 客戶端庫,以便每個客戶端應用程序都可以使用豐富的 OData 源几迄。OData 的生產(chǎn)者和使用者共同構成了 OData“生態(tài)系統(tǒng)”表蝙。
3、oData與restful是什么關系乓旗?
答:現(xiàn)在我們了解到了府蛇,restful是一個前端與后端交互的應用協(xié)議,而oData是restful實現(xiàn)的一種方式屿愚。
SharePoint 站點的服務文檔
OData URI 約定
服務文檔列出了服務提供的實體集汇跨。請記住务荆,您可以使用強大的 URI 語法(是 OData 協(xié)議的可選部分)來訪問此服務中的資源。讓我們快速了解一下此服務的 URI 語法穷遂。若要訪問每個實體集的源函匕,您需要將實體集的名稱附加到服務的基本 URI 中,例如 http://myhost/Listings.svc/Properties 將指向 Properties 實體集中的一組實體蚪黑。
還可以使用單個實體的鍵值來指向該實體盅惜,例如 URI http://myhost/ Listings.svc/Properties(0) 將指向 ID = 0 的房產(chǎn)。您可以將關系名稱附加到 URI 末尾忌穿,以指向此實體與其他實體或實體集的關系抒寂,因此 http://myhost/ Listings.svc/Properties(0)/Listings 將指向與 ID = 0 的房產(chǎn)實體相關的一組銷售清單。使用此語法掠剑,可以瀏覽關系的很多層級屈芜。
URI 還定義了很多可以附加到 URI 的查詢選項,以便在一定程度上修改基本查詢朴译,其中每個查詢選項都定義為名稱/值對井佑。例如,附加查詢選項 $top=10 后眠寿,就將查詢限制為僅包含結果中的前 10 個實體躬翁。圖 4 列出了 URI 語法中所有可用的查詢選項。
$top=n | 將查詢限制為前 n 個實體盯拱。 |
---|---|
$skip=n | 跳過集中的前 n 個實體盒发。 |
$inlinecount=allpages | 在結果中包含集中所有實體的計數(shù)。 |
$filter=<表達式> | 可以用表達式限制查詢返回的結果(例如:$filter=Status eq 'Available' 將結果限制為具有 Status 屬性且此屬性值為 Available 的實體)坟乾。 |
$orderby=<表達式> | 按照實體的一組屬性對結果進行排序 |
$select=<表達式> | 指定要返回的實體的屬性子集迹辐。 |
$format | 指定要返回的源的格式(ATOM 或 JSON)蝶防。此選項在 WCF 數(shù)據(jù)服務中不受支持甚侣。 |
從 SharePoint 提供數(shù)據(jù)
在前述部分中,我為您展示了如何提供關系數(shù)據(jù)庫中存儲的數(shù)據(jù)间学,以及房地產(chǎn)網(wǎng)站的房產(chǎn)和銷售清單信息殷费。讓我們假設我還有負責出售房產(chǎn)的代理人信息,但這些數(shù)據(jù)存儲在 SharePoint 站點中低葫。Microsoft SharePoint 2010 提供了相應功能详羡,可以將所有列表和列表中的文檔作為 OData 源提供。這非常適合該房地產(chǎn)網(wǎng)站嘿悬,因為這意味著該公司員工輸入的代理人信息可作為 OData 源使用实柠,可以包含在我構建的銷售清單應用程序中。使用 SharePoint 接口負責輸入和更新此數(shù)據(jù)的用戶不必更改其工作流程來適應我的應用程序善涨。輸入到公司 SharePoint 站點的數(shù)據(jù)在即將創(chuàng)建的 Listings 應用程序中實時可用窒盐。
在 SharePoint 系統(tǒng)中安裝適用于 .NET Framework 3.5 SP1 的 ADO.NET 數(shù)據(jù)服務更新后草则,對于每個將清單數(shù)據(jù)作為 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' | 根據(jù)表達式的狀態(tài)返回結果(返回ProductName 等于Tofu的Products) |
****$orderby**** | http://localhost:8090/api/Meetings?$orderby=ProductName | 根據(jù)結果排序(根據(jù)ProductName列排序) |
****$skip**** | http://localhost:8090/api/Meetings?$skip=10 | 越過結果中的n條數(shù)據(jù)份殿,常用于分頁 |
****$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中包含的導航屬性(關聯(lián)屬性)Supplier |
****$inlinecount**** | http://localhost:8090/api/Meetings?$inlinecount=allpages | 向服務器獲取符合條件的資源總數(shù)(分頁的total值) |
函數(shù)操作:
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
:測試某個字段是否小于或等于某個常量值