最近做了一個小專案,其中用到了 WCF Data Service,之前是叫 ADO.NET Data Service 的。關於WCF Data Service,部落格園裡的介紹並不多,但它確實是個很好的框架。可以很方便地通HTTP來訪問資料庫,如果你是做富客戶端開發的,用它絕對能大大減少你的工作量。出於對這個框架的喜愛,於是把自己的一些使用經驗寫下來,並且希望有更多的人能夠用上。
OData簡介
說起 WCF Data Service ,不得不說的是 OData。對於一個標準的 Web 服務,它往往會提供了一些功能,比如說:訂貨、退貨這些,然後使用者通過HTTP協議來使用這些功能。這是面向服務的基本思想,然而面前服務有一些缺點,很多時候,沒法準確預測到使用者需要什麼。因此總是要不斷地增加新的介面,不斷地修改返回的物件。
另一種方法是所謂的資源為導向的架構(ROA),暴露Web服務的資源,並且使用者能夠對各種對資源進行實時的查詢,具有表現資料和整合資料的能力。類似於使用 SQL 在資料庫中查詢資料。唯一的區別是,ROA你通過URL建立查詢。
OData是一個協議,規定公開資料的Web服務的特點。下面這段話是OData的定義
Open Data Protocol (開放資料協議,OData)是用來查詢和更新資料的一種Web協議,其提供了把存在於應用程式中的資料暴露出來的方式。OData運用且構建於很多 Web技術之上,比如HTTP、Atom Publishing Protocol(AtomPub)和JSON,提供了從各種應用程式、服務和儲存庫中訪問資訊的能力。OData被用來從各種資料來源中暴露和訪問資訊, 這些資料來源包括但不限於:關聯式資料庫、檔案系統、內容管理系統和傳統Web站點。
OData協議概述
正如上面所提到的,OData服務通過Web服務來透露所提供的資源。然後您可以通過URL訪問這些資源。 OData 協議指明瞭如何通過HTTP來查詢資料。基本原則是,你可以輸入某些帶引數的 URL 來對資源進行查詢。
下面是一些你可以使用的 OData 公共服務,更多可以使用的 OData 服務,你可以通過訪問 OData 的官網來獲得。
- http://services.odata.org/WebSite/OData.svc/
- http://services.odata.org/OData/OData.svc/
- http://services.odata.org/Northwind/Northwind.svc/
在介紹使用 OData 協議進行查詢時,將會使用這些公開的 OData 服務。下面以 http://services.odata.org/Northwind/Northwind.svc/
為例,在瀏覽器中輸入剛網址,你將會看到
從上圖中你可以看到該服務提供了 Products、Advertisements、Categories、Suppliers 這些資源。通過輸入下面這些 URL 即可對這些資源進行訪問。例如:
- http://services.odata.org/Northwind/Northwind.svc/Products
- http://services.odata.org/Northwind/Northwind.svc/Categories
- http://services.odata.org/Northwind/Northwind.svc/Suppliers
這些查詢,將會返回該資源的所有基於 XML-Atom 格式的資料。例如下圖是 Products 的資料。
格式輸出的資料
預設的格式是 XML-Atom,當然,你也可以其它格式,當前還支援 JSON 格式。只要在URL上新增 $format=json 引數,即可獲得 json 格式的資料。
- http://services.odata.org/Northwind/Northwind.svc/Products?$format=json
- http://services.odata.org/Northwind/Northwind.svc/Categories?$format=json
- http://services.odata.org/Northwind/Northwind.svc/Suppliers?$format=json
選取欄位
預設情況下,是會返回所有欄位的,但很多時候,你可能只是需要獲取其它的某些欄位。例如下面的查詢中只返回 ID 和 Name 欄位。
- http://services.odata.org/Northwind/Northwind.svc/Products?$select=ProductID,ProductName&$format=json
展開
很多時候,我們還需要將關聯的導航屬性取出來。開啟下面的 URL:http://services.odata.org/Northwind/Northwind.svc/$metadata
從下面這個圖可以看到,Product 還有 Category、Order_Details、Supplier 三個導航屬性。
通過 expand 引數,可以把相關的導航屬性的資料一併取出。輸入 http://services.odata.org/Northwind/Northwind.svc/Products?$format=json&$expand=Supplier
當然,你也可以一次展開多個導航屬性,多個導航屬性之間使用“,”分隔,例如:
ttp://services.odata.org/Northwind/Northwind.svc/Products?$format=json&$expand=Supplier,Category
分頁
通過 $top 和 $skip 引數,可以進行分頁顯示,例如:
http://services.odata.org/Northwind/Northwind.svc/Products?$format=json&$skip=10&$take=10
過濾
使用 $filter引數,可以對資料進行過濾,例如:
http://services.odata.org/Northwind/Northwind.svc/Products?$format=json&ProductId gt 4
排序
使用 $orderby 引數,可以對資料進行排序,例如:
http://services.odata.org/Northwind/Northwind.svc/Products?$format=json&$orderby=Product
升序
http://services.odata.org/Northwind/Northwind.svc/Products?$format=json&$orderby=Product asc
降序
http://services.odata.org/Northwind/Northwind.svc/Products?$format=json&$orderby=Product desc
關於關鍵字的詳細使用,可以參考 OData 官網的文件。
http://www.odata.org/documentation/odata-v2-documentation/uri-conventions/