构建OData服务的教程

在这个多部分系列教程中,将构建一个OData服务,遵循之前讨论过的REST架构。在深入代码示例之前,让先了解一下OData的定义和规范。

OData简介

OData代表开放数据协议。它是一种标准,用于通过互联网提供数据访问。OData由微软倡导,作为一种开放规范,并被许多不同的平台采用。通过使用OData,您可以构建一种统一的方式来公开功能齐全的数据API(查询、更新),OData的一个好处是它建立在成熟的标准Web技术和协议之上,如HTTP、Atom发布协议、JSON,并遵循REST架构,以便从不同的应用程序、服务和数据存储中提供数据访问。

众所周知,任何遵循REST原则的服务都将遵守以下方面:

  • 资源由唯一的URI标识
  • 对资源的操作应使用HTTP动词(GET、POST、PUT、DELETE)完成
  • 启用内容协商,允许客户端指定返回的数据类型格式:XML格式(AtomPub)或JSON格式(Verbose/Light)

在开始构建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

决定将这个教程分成四部分,如下所示:

  1. OData简介和查询现有OData服务 - 第1部分(本文)
  2. 使用ASP.NETWeb API创建只读OData端点 - 第2部分
  3. 使用ASP.NETWeb API在OData端点上进行CRUD操作 - 第3部分
  4. 使用AngularJS和Breeze.js消费OData服务 - 第4部分(即将推出)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485