3.4 资源类型
资源类型是指一类资源,而一个资源是资源类型的具体实例。也就是说,资源类型定义了一类资源。一个资源的资源类型是通过使用资源类型公共属性来声明的,或者是在使用了资源类型参数的链接中声明的。
资源类型可以是预定义的(例如,在OCF规范中的核心资源类型或垂直域规范中的资源类型),也可以是自定义的,由制造商、终端用户或者设备开发人员定义(例如,供应商定义的资源类型)。资源类型及其定义细节可以通过外部(例如,通过文档)传输,也可以通过使用API、应用程序下载和使用的元数据来进行明确定义。OCF推荐使用RAML或JSON模式明确定义资源类型。
每一个资源类型都会有一个ID来标识,资源类型ID是一个分段的小写字符串,各段之间用“.”隔开。整个字符串表示资源类型ID。当定义ID时,每一段可能会表示适用于该资源类型的任何语义。例如,每段都可以表示一个命名空间。一旦ID被定义,ID应该被非透明地使用,而不是从每个段中推断出任何信息。当字符串"oic"用作资源类型ID定义的第一段时,该字符串被保留为OCF定义的资源类型。资源类型ID可以用于寻找资源类型的定义,可以作为权威的引用。属性名称和属性值都是区分大小写的,并且“rt”属性中的资源类型ID,应该以区分大小写的方式进行比较。
3.4.1 资源类型属性
当一个资源被实例化或创建时,资源应该具有一个或多个资源类型,这些资源类型是作为资源模板的。资源所遵守的资源类型应该使用资源的“rt”公共属性进行声明。对于用作标准的资源类型,“rt”公共属性的属性值应该是一个资源类型ID的列表(即"rt"=<资源类型ID列表>)。资源类型公共属性定义如表3-3所示。资源类型可以在用户(即客户端)和资源主机(即服务器端)之间被明确地发现或隐式地共享。
表3-3 资源类型公共属性定义
3.4.2 资源类型定义
在OCF规范中,资源类型声明如下。
(1)预定义的URI(可选):在一个OCF规范中,可以为一个特定的资源类型指定一个预定义的URI。当一个资源类型有一个预定义的URI时,该资源类型的所有实例将只使用这个预定义的URI,其他资源类型的实例不会使用该预定义的URI。
(2)资源类型名称(可选):指明资源类型的人性化名称。
(3)资源类型ID:“rt”属性的值,指明了资源类型(如“oic.wk.p”),由多个段组成的小写字母字符串,各段之间用“.”隔开;每段可能表示一个命名空间,后一段(从左到右)表示的就是前一段的子命名空间;在实现的过程中会不透明地使用这些段,并且使用区分大小写的字符串匹配。
(4)资源接口:该资源类型可能支持的一些接口。
(5)资源属性:应用于一个资源类型的所有属性的定义。资源类型的定义中,应该规定一个属性是强制的、在某种条件下是强制的还是可选的。
(6)相关资源类型(可选):可以作为该资源类型一部分,是被引用的其他资源类型规范,也适用于集合。
(7)Mime类型(可选):包括序列化资源支持的Mime类型(如application/cbor、application/json和application/xml)。
表3-4、表3-5将一个foobar资源类型及其相关属性,作为一个例子进行了描述。
表3-4 foobar资源类型示例
表3-5 foobar属性示例
foobar资源类型的实例如下所示。
{ "rt":["oic.r.foobar"], "if":["oic.if.a"], "value":"foo value" }
foobar 资源类型的示例Schema 如下所示。
3.4.3 多“rt”值资源
多“rt”值资源是指具有多种资源类型。这样的资源与多个资源类型相关联,因此它的“rt”属性值具有多个资源类型ID(如"rt":["oic.r.switch.binary","oic.r.light.brightness"])。“rt”属性值中资源类型ID的顺序是无意义的。例如,"rt":["oic.r.switch.binary","oic.r.light.brightness"]和"rt":["oic.r.light.brightness","oic.r.switch binary"]具有相同的含义。
资源类型为多“rt”值的资源应满足以下条件。
(1)属性名称除了“公共属性”以外,每个资源类型的属性名称应该是唯一的(在多“rt”值资源的范围内),否则会出现冲突的属性语义。如果两个资源类型具有相同名称的属性,则多“rt”值资源不应由这些资源类型组成。
(2)多“rt”值资源满足每种资源类型的所有要求,并符合每个组件资源类型的RAML/JSON定义。因此,多“rt”值资源的强制属性应为每种资源类型的所有强制属性的并集。例如,在资源“rt”为["oic.r.switch.binary","oic.r.light.brightness"]中的强制属性是“值”和“亮度”,前者属于“oic.r.switch.binary”,后者属于“oic.r.light.brightness”。
(3)多“rt”值资源接口集合应是组件资源类型中接口集合的并集。响应于接口上的CRUDN操作资源表示应为该接口定义模式的并集。多“rt”值资源的默认接口应为基准接口(“oic.if.baseline”),因为这是资源类型之间唯一保证的通用接口。
为了清楚起见,如果每个资源类型支持相同的一组接口,则所得到的多“rt”值资源具有相同的接口集,默认接口为“oic.if.baseline”。
对多“rt”值资源的默认接口“oic.if.a”“oic.if.s”“oic.if.r”和“oic.if.rw”等“rt”查询是通用“rt”查询的扩展。当服务器端收到带有“rt”查询的多“rt”值资源的检索请求(即GET/ResExample?rt=oic.r.foo)时,服务器端应当在查询目标为多“rt”值资源某一项“rt”属性中进行响应,且应仅返回与查询相关联的属性。例如,当目标多“rt”值资源“rt”:["oic.r.switch.binary","oic.r.light.brightness"]在接收到使用“rt”查询"GET/ResExample?rt=oic.r.switch.binary:"时,服务器端只响应“oic.r.switch.binary”的属性。