OData协议,全称Open Data Protocol,是一种用于数据共享的开放协议。它基于AtomPub协议,支持RESTful架构,使得通过简单的Web浏览器就可以查看通过OData服务暴露的数据。OData协议规范受到微软开放规范承诺(Microsoft Open Specification Promise,OSP)的保护。
OData的核心思想是使用广为人知的数据格式(Atom feed)来展示实体列表。AtomPub协议通过允许读取以外的CRUD(创建、读取、更新、删除)操作来扩展基础的Atom协议。OData进一步扩展了AtomPub,通过在feed上执行简单查询来实现。OData通常还暴露了一系列实体集,以及一个更高层次的分组feed,其中可以看到所有可用的feed。
为了阐释这些概念,让看看OData官方网站()。它通过OData服务暴露了其数据:
http://services.odata.org/website/odata.svc
可以直接浏览这个页面,它会返回一个XML文档,列出不同的实体集:
XML格式如下:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<service xml:base="http://services.odata.org/Website/odata.svc/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app" xmlns="http://www.w3.org/2007/app">
<workspace>
<atom:title>Default</atom:title>
<collection href="ODataConsumers">
<atom:title>ODataConsumers</atom:title>
</collection>
<collection href="ODataProducerApplications">
<atom:title>ODataProducerApplications</atom:title>
</collection>
<collection href="ODataProducerLiveServices">
<atom:title>ODataProducerLiveServices</atom:title>
</collection>
</workspace>
</service>
这个实体集(或feed)列表在OData中被称为工作区(workspace)。
现在,让看看其中一个feed,例如数据消费者(ODataConsumers)。该集合有一个href XML属性,指示如何构建URL来访问它:
http://services.odata.org/website/odata.svc/ODataConsumers
这个URL也返回一个XML文档,一个Atom feed。
如果在Internet Explorer中查看,会在feed阅读器视图中看到它。要查看原始XML,必须进入Internet选项,在内容标签页:
在底部,按下“Feeds和Web Slices”部分下的“设置”按钮。在设置屏幕上,确保关闭“feed阅读器视图”。
可能需要重新打开浏览器或至少是标签页来查看原始XML。
现在,如果查看XML,它是一个标准的Atom feed:它有一个标题,一个ID,一个更新时间,以及一堆条目。条目是实际的数据。如果查看一个条目:
<entry>
<id>http://services.odata.org/Website/odata.svc/ODataConsumers(2)</id>
<title type="text">OData Explorer</title>
<summary type="text">A Silverlight application that can browse OData Services. It is available as part of the OData SDK Code Samples, and is available online at Silverlight.net/ODataExplorer.</summary>
<updated>2010-06-26T17:46:31Z</updated>
<author><name/></author>
<link rel="edit" title="ODataConsumer" href="ODataConsumers(2)"/>
<category term="ODataServices.ODataConsumer" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
<content type="application/xml">
<m:properties>
<d:Id m:type="Edm.Int32">2</d:Id>
<d:Name>OData Explorer</d:Name>
<d:Description>A Silverlight application that can browse OData Services. It is available as part of the OData SDK Code Samples, and is available online at Silverlight.net/ODataExplorer.</d:Description>
<d:ApplicationUrl>http://silverlight.net/ODataExplorer</d:ApplicationUrl>
</m:properties>
</content>
</entry>
条目包含一个ID和一些其他属性,最重要的是content。现在,content包含标准EDM数据(实体数据模型)。通常,每个条目的内容属性是相同的,因此可以以表格格式显示数据。
现在,一个实体集feed让可以访问整个实体集。OData允许通过feed查询实体集,通过操作URL。
例如,假设只想检索feed的前三个条目;会查询以下URL:
http://services.odata.org/website/odata.svc/ODataConsumers?$top=3
基本上对数据消费者URL应用了一个top操作符。以下是可以不同方式查询feed的非详尽列表:
查询字符串 描述 示例
$skip=<n> 跳过feed的前n个元素。 Browse...
$orderby=<property-name> 按给定属性排序结果。 Browse...
$filter=<filter expression> 根据过滤表达式过滤feed。 Browse...
有关不同查询字符串选项的详尽列表,请参见。OData查询系统相当强大,尽管不如SQL强大。
一个熟悉不同查询OData服务方式的好工具可在。它是一个免费的Silverlight应用程序,允许查询一个OData服务,并以表格格式显示结果。
OData不仅仅是关于查询。它支持CRUD操作。这些操作是通过使用不同的HTTP动词(GET用于读取,PUT用于创建,POST用于更新,DELETE用于删除)来执行的。
默认情况下,OData服务返回Atom XML格式。它还支持JSON。为了接收JSON表示,这必须在HTTP头中编码。有关更多详细信息,请参见。
为什么想使用OData而不是自己的XML格式(例如,基于SOAP)?一般来说,OData是一个标准,因此被越来越多的客户端理解。具体来说,它被.NET框架理解:可以从客户端代码对OData服务执行LINQ查询。它也被Microsoft Excel 2010(用于数据透视表)理解。