OData 4.0 的新特性

  • Jonathan Allen
  • 侯伯薇

2013 年 6 月 4 日

话题:SOAREST架构

OData 是微软支持的一种查询标准,它的第四版使用了 REST 规范,最近已经被 OASIS 委员会接受。公开审查期会截至六月二日,微软期望 OASIS 在今年晚些时候采纳该标准。

这个标准的其他赞助商包括 SAP、IBM、Progress Software、美国东北大学和 Citrix。SAP 当前提供了针对 Java 的开源 OData 库。对于 JavaScript,JayData提供了开源和商业支持的版本。

1) 数据模型变更 对于在 CSDL 中如何表达数据模型有一些改变,特别是:

a) 对如何表达关系做出了显著的变更和简化。关系定义现在作为导航属性(navigation property)的一部分来表达,而不是指定单独的连接和连接集。另外,这可以支持单向关系和真正的包含。

b) 顶级“已命名实体(Named Entities)”让你可以在实体容器上暴露出一个单例实体。

c) 函数(function)和动作(action)现在都定义在 schema 中(像实体和复杂类型),并且可能会从你的实体容器通过导入函数和动作来暴露。

d) 服务文档现在除了包含没有参数的函数导入之外,还可以包含顶级的“已命名实体”。

e) 我们通过实体标签(etag)向元数据增加了版本控制。

f) 我们改善了对元素的定义,从而更新了分布式数据模型,让 schema 可以引用其他 schema,并确保那个实例可以总是指回到 JSON 和 ATOM 中的元数据。

g) 我们开始定义服务如何可以把元数据暴露为服务。这是最近增加的,我们希望可以获得关于那个数据模型的反馈。

h) 我们放松了复杂类型属性上的一些约束;实体的关键属性现在可以在包含的复杂类型上,就像导航属性和引用约束一样。我们还为复杂类型定义了继承的语义。

i) 我们允许在没有键值的情况下定义抽象实体类型;如果没有指定的话,那么第一个非抽象的继承类就必须指定一个键值。

j) 我们围绕注解做出了一些修改。特别是,我们合并了 TypeAnnotations 和 ValueAnnotations,增加了默认值,并应用其上,另外还开始定义核心词汇表,以获取模型在行为上的一些方面(像针对 identity 的 server-generated 属性、计算字段等等。)

2) 数据类型变更 我们优化了一系列基本类型(特别是日期和时间的系列数据类型)。特别是:

a) 我们删除了 Edm.Float(Edm.Single 的同义词)和 Edm.DateTime(使用 Edm.DateTimeOffset),不赞成使用 Edm.Time,推荐使用 Edm.Duration 和 Edm.TimeOfDay。

b) 我们为新数据类型增加了相关的标准函数,还增加了 now()、mindatetime() 和 maxdatetime() 函数。

c) 我们为枚举定义了文字型语法以及序列化格式。

d) 我们定义了抽象的“Edm.EntityType”、“Edm.ComplexType”、“Edm.PrimitiveType”,以及每种类型的集合,这可以用于数据模型中,其中实体或复杂或基本的类型是未知的。真正的类型会在实际运行时指定。

e) 我们增加了实体引用(entity reference)的概念,那可以在很多地方替代实体来使用和返回。

f) 我们为命名基本类型和固定的系列内容增加了“TypeDefinition”的概念。

3) URL 变更

a) 我们修改了如何表达扩展(expand)的方式。$expand 现在采用了扩展选项,包括 $filter(用于过滤扩展)、$orderby 等等,还可以使用 $expand 和 $select 作为扩展选项,用于内嵌的扩展和投影,而不在顶级 $expand 和 $select 通过导航属性来表示路径。我们还为递归扩展增加了 $levels。

b) 我们为在资源上做全文搜索增加了 $search 的系统查询选项。

c) 我们用 $count 替换了 $inlinecount,它可以应用给集合或者多个导航属性,从而进行过滤,并且可以用于返回相关实体的数量,而不是实体本身的数量。

4) 语义 我们围绕如何处理请求改善了一些语义。特别是:

a) 我们增加了一致性小节来定义一致性的不同级别。这是我们期待获得反馈的另一个方面。正如你所说,说明书很庞大,我们想要确保实现人员知道,为了达到一致性,并不需要实现实体的规格说明。

b) 我们更新了 $batch 相关的很多行为,包括它如何表现为同步结果,以及对错误的继续执行还是失败的引用。

c) 我们强烈推荐使用 PATCH 而不是 PUT 来更新实体和复杂类型,并澄清了 PATCH 对复杂类型的行为(应该只更新指定的属性)。

d) 我们在最新的 IETF 草案中增加了 Prefer 头,并为客户端增加了大量引用,可以提示服务所需的行为。

e) 我们对不存在资源的 URL 做 PUT 或 PATCH,从而支持 UPSERT。

5) 新服务方面 我们增加了对服务新的(可选的)支持:

a) 异步执行通过 return-async 请求头来定义,这遵循了 IETF 中最新的想法。

b) 变更跟踪(Delta)支持现在定义为说明书的一部分,从而对之前取得的结果值返回差别。语义是围绕对相关实体的变更跟踪来定义的,并为了表现已删除的实体和增加或删除的链接来细化,并针对每种格式来记录。

6) 格式

a) 我们不推荐使用旧的“JSON Verbose”格式,而推荐使用新的、更整洁的 JSON 格式。

b) 我们不需要服务来支持 ATOM;一个服务必须实现 ATOM 或者 JSON;我们推荐 JSON,并在最高的一致性级别上需要它。

c) ATOM 现在包含了响应的元数据 URL,如果类型信息无法从响应的元数据 URL 中继承到,那么就可能会包含导航属性的元数据 URL。

SOAREST架构