在这个多部分系列教程中,将构建一个OData服务,遵循之前讨论过的REST架构。在深入代码示例之前,让先了解一下OData的定义和规范。
OData代表开放数据协议。它是一种标准,用于通过互联网提供数据访问。OData由微软倡导,作为一种开放规范,并被许多不同的平台采用。通过使用OData,您可以构建一种统一的方式来公开功能齐全的数据API(查询、更新),OData的一个好处是它建立在成熟的标准Web技术和协议之上,如HTTP、Atom发布协议、JSON,并遵循REST架构,以便从不同的应用程序、服务和数据存储中提供数据访问。
众所周知,任何遵循REST原则的服务都将遵守以下方面:
在开始构建OData服务之前,让检查一下在互联网上发布的现有OData服务,并使用Northwind数据库。该服务的基本URI是http://services.odata.org/Northwind/Northwind.svc。您可以使用任何REST客户端(如Fiddler、PostMan)来构建这些HTTP请求,由于现在只是查询服务(不发送更新),您也可以使用您喜欢的浏览器。请注意,您可以使用Linq4Pad生成和测试复杂的OData查询。
下面的表格展示了一些可以用来查询服务的OData查询选项:
选项 | OData服务URL | 说明 |
---|---|---|
$filter | http://services.odata.org/Northwind/Northwind.svc/Products?$filter=ProductName eq 'Tofu' | 基于布尔条件过滤结果,例如,获取产品名称为'Tofu'的产品 |
$orderby | http://services.odata.org/Northwind/Northwind.svc/Products?$orderby=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 | 选择要在响应中返回的属性,例如,返回ProductName和UnitPrice |
$expand | http://services.odata.org/Northwind/Northwind.svc/Products?$expand=Supplier | 内联展开相关实体,例如,展开每个产品的供应商实体 |
$inlinecount | http://services.odata.org/Northwind/Northwind.svc/Products?$inlinecount=allpages | 通知服务器在响应中返回匹配记录的总数 |
如上表所示,可以组合不同的查询选项,并提供复杂的搜索条件。例如,如果想实现服务器端分页,可以发出以下HTTP GET请求:http://services.odata.org/Northwind/Northwind.svc/Products?$top=10&$skip=0&$orderby=ProductName&$inlinecount=allpages,其中$skip代表要跳过的记录数(通常是PageSize x PageIndex),$inlinecount代表产品的总数。要查看所有可用查询选项的完整列表,您可以访问此链接。
正如之前所说的,OData服务允许内容协商,因此客户端可以通过设置请求的Accept头部来选择响应格式,每种响应格式都有其优缺点。下面的表格说明了差异:
XML (Atom Publishing) | JSON Verbose | JSON Light |
---|---|---|
支持OData版本1、2和3 | 支持OData版本1、2和3 | 仅支持OData版本3 |
包含元数据和超链接 | 包含数据和元数据 | 仅包含数据,没有元数据 |
所有产品实体的负载大小为28.67 KB | 所有产品实体的负载大小为14.34 KB,比XML小50% | 所有产品实体的负载大小为4.25 KB,比XML小75% |
不易在移动客户端上使用 | 是 | 是 |
Accept头部为application/atom+xml | Accept头部为application/json;odata=verbose | Accept头部为application/json |
决定将这个教程分成四部分,如下所示: