Open Data Protocol (OData)概述






4.35/5 (16投票s)
OData 协议概述:它是什么、如何工作以及在何处使用它最合适。
引言
在本文中,我想对 OData 协议进行概述:它是什么、如何工作、在何处使用它最合适。
背景
Open Data Protocol(或 OData,http://www.odata.org)是一个开放的数据共享协议。它构建在 AtomPub(RFC 5023)之上,而 AtomPub 本身是 Atom Publishing Protocol(RFC 4287)的扩展。OData 是一个 REST(Representational State Transfer)协议;因此,简单的网页浏览器就可以查看 OData 服务公开的数据。OData 规范遵循 Microsoft Open Specification Promise(OSP)。
OData 的基本理念是使用一种众所周知的数据格式(Atom feed)来公开实体列表。AtomPub 通过允许不仅读取,还支持完整的 CRUD 操作集来扩展基本的 Atom 协议。OData 通过实现对 Feed 的简单查询来扩展 AtomPub。OData 通常还会公开一组实体集,并通过一个更高级别的分组 Feed 来展示所有可用的 Feed。
示例
为了说明这些概念,让我们看看 OData 网站(http://www.odata.org)。它通过 OData 服务公开其数据:http://services.odata.org/website/odata.svc。您可以直接浏览该页面,它会返回一个 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 中称为工作空间。
现在,让我们看看其中一个 Feed,例如,数据消费者(ODataConsumers)。该集合有一个 href
XML 属性,指示如何构建 URL 来访问它:http://services.odata.org/website/odata.svc/ODataConsumers。此 URL 也返回一个 XML 文档,即一个 Atom Feed。
现在,如果您在 Internet Explorer 中查看它,它会以 Feed 阅读器视图显示。要能够查看原始 XML,您必须进入“*Internet 选项*”,在“*内容*”选项卡中进行设置。
在底部,“*Feed 和 Web Slice*”部分下,按“*设置*”按钮。在设置屏幕中,确保关闭“*阅读 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 数据(Entity Data Model)。通常,“content”属性对于每个条目都是相同的,因此您可以将数据以表格形式显示。
查询
现在,实体集 Feed 让您可以访问整个实体集。OData 允许您通过 Feed,通过修改 URL 来查询实体集。
例如,假设我们只想检索 Feed 的前三个条目;我们将查询以下 URL:http://services.odata.org/website/odata.svc/ODataConsumers?$top=3。我们基本上对数据消费者 URL 应用了一个“*top*”运算符。以下是一些可以用来以不同方式查询 Feed 的操作的非详尽列表:
查询字符串 | 描述 | 示例 |
$skip=<n> | 跳过 Feed 的前 n 个元素。 | 浏览... |
$orderby=<property-name> | 按给定属性对结果进行排序。 | 浏览... |
$filter=<filter expression> | 根据过滤表达式过滤 Feed。 | 浏览... |
有关不同查询字符串选项的完整列表,请参阅 http://www.odata.org/developers/protocols/uri-conventions#QueryStringOptions。OData 查询系统非常强大,但不如 SQL 强大。
有一个很好的工具可以帮助您熟悉查询 OData 服务的不同方法,该工具可在 http://www.silverlight.net/content/samples/odataexplorer 获得。这是一个免费的 Silverlight 应用程序,允许您查询 OData 服务并以表格格式显示结果。
更新
OData 不仅仅是关于查询。它支持 CRUD 操作。这些操作通过使用不同的 HTTP 动词(GET 用于读取,PUT 用于创建,POST 用于更新,DELETE 用于删除)来执行。
JSON
默认情况下,OData 服务返回 Atom XML 格式。它也支持 JSON。为了接收 JSON 表示,必须在 HTTP 标头中进行编码。有关更多详细信息,请参阅 http://www.odata.org/developers/protocols/ operations#RepresentationFormatsAndContentTypeNegotiation。
何时使用 OData
您为什么希望使用 OData 而不是自己的 XML 格式(例如,基于 SOAP)?总的来说,OData 是一种标准,因此被越来越多的 客户端所理解。具体来说,.NET Framework 理解它:您可以从客户端代码对 OData 服务执行 LINQ 查询。Microsoft Excel 2010(用于数据透视表)也理解它。
因此,OData 作为列表的通用数据格式。它不如 SQL 或 ODBC 源通用,但它在数据的存储和呈现方式上提供了更大的灵活性。
对我来说,一个特别有用的场景是替代经典的Get<EntityName>By<Criteria> Web 服务。我们都见过 GetAllEmployees
、GetEmployeeByID
、GetEmployeesByDepartment
等等。这些服务的实现很枯燥,您最终需要为新条件添加新的 Web 方法(这意味着大量的代码重复,从而导致维护问题)。OData 将允许客户端规定条件。您编写一次服务,许多客户端就可以以不同的方式使用它。