当前位置: 首页 > 工具软件 > odata4j > 使用案例 >

OData 4.0的新特性

百里成仁
2023-12-01

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。

\
 类似资料: