第一季的連結以及系列導航:http://www.cnblogs.com/fzrain/p/3490137.html
在這裡,首先要感謝Taiseer Joudeh不斷的為我們帶來最新的技術分享,樓主對web api這種技術可謂是非常的喜歡,同時也得到很多園友的支援,所以繼續是必然的。經過上一階段的學習,我們對於web api應該已經不是很陌生了,從本篇開始將開始介紹OData。我也是剛開始學,因此把學習過程記錄下來並分享給大家,期待一起交流進步。
在本次系列中,我們將沿用第一季的專案背景來構建一個OData服務,本文將用一個簡單的例子幫大家來認識OData,在介紹例子之前我們先介紹一下OData的定義和約定。
OData簡介
Open Data Protocol (開放資料協議,OData)是用來查詢和更新資料的一種Web協議,其提供了把存在於應用程式中的資料暴露出來的方式。OData運用且構建於很多 Web技術之上,比如HTTP、Atom Publishing Protocol(AtomPub)和JSON,提供了從各種應用程式、服務和儲存庫中訪問資訊的能力。OData被用來從各種資料來源中暴露和訪問資訊, 這些資料來源包括但不限於:關係資料庫、檔案系統、內容管理系統和傳統Web站點。
我們知道,構建符合REST原則的服務應該具備一下特點:
1.每一個資源都由一個唯一的URI來標識。
2.通過HTTP方法(GET, POST, PUT, and DELETE)來實現對資源的CRUD。
3.能根據客戶端指定的格式來返回資料:XML,JSON等。
小應用:查詢現有的OData服務
在我們開始建立OData服務之前,為了讓大家對OData有一個更深入的理解,在這裡我們將查詢一個已經存在的OData服務(使用的是Northwind資料庫),對應的基地址是:http://services.odata.org/Northwind/Northwind.svc。你可以使用任何REST客戶端(例如fiddler,PostMan)。當然如果只是做查詢操作,你也可以直接使用瀏覽器。
下表列舉了一些常用的Odata操作:
操作 |
URL |
說明 |
$filter | http://services.odata.org/Northwind/Northwind.svc/Products?$filter=ProductName eq 'Tofu' | 根據表示式的狀態返回結果(返回ProductName 等於Tofu的Products) |
$orderby | http://services.odata.org/Northwind/Northwind.svc/Products?$orderby=ProductName | 根據結果排序(根據ProductName列排序) |
$skip | http://services.odata.org/Northwind/Northwind.svc/Products?$skip=10 | 越過結果中的n條資料,常用於分頁 |
$top | http://services.odata.org/Northwind/Northwind.svc/Products?$top=10 | 返回結果中的前n條記錄,常用於分頁 |
$select | http://services.odata.org/Northwind/Northwind.svc/Products?$filter=ProductName eq 'Tofu'&$select=ProductName,UnitPrice | 選擇需要返回的屬性 |
$expand | http://services.odata.org/Northwind/Northwind.svc/Products?$expand=Supplier | 返回Products中包含的導航屬性(關聯屬性)Supplier |
$inlinecount | http://services.odata.org/Northwind/Northwind.svc/Products?$inlinecount=allpages | 向伺服器獲取符合條件的資源總數(分頁的total值) |
通過上面表格的內容,我們還可以通過組合查詢條件來實現複雜的查詢(例如:我們想實現伺服器端的分頁,那麼我們就可以使用如下的URI:http://services.odata.org/Northwind/Northwind.svc/Products?$top=10&$skip=0&$orderby=ProductName&$inlinecount=allpages)。在上面的URI中,$skip代表跳過的資料,通常指pageSize*pageIndex,同時$inlinecount返回一個int值代表記錄總數。
OData服務支援內容的選擇,也就是說客戶端可以通過設定請求頭Accept header來定製響應資料的格式,每種格式都有各自的優缺點,下表就說明了彼此的不同之處:
XML |
JSON(詳細版) |
JSON(輕量版) |
|
OData版本 | 版本1,2,3 | 版本1,2,3 | 版本3 |
元資料及超連結 | 包含資料和元資料 | 包含資料和元資料 | 僅包含資料 |
資料大小 | 28.67 KBs | 14.34 KBs, 小了近50% | 4.25 KBs, 小了近75% |
對於移動客戶端消費是否簡單 | 否 | 是 | 是 |
Accept Header | application/atom+xml | application/json;odata=verbose | application/json |