第一季的連結以及系列導航: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客戶端(例如fiddlerPostMan)。當然如果只是做查詢操作,你也可以直接使用瀏覽器。

下表列舉了一些常用的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