6.4. 接收事件通知
RESTCONF通知根据事件流的定义进行编码。
事件数据的结构基于[RFC5277]的第4节中的<notification>元素定义。它必须符合[RFC5277]的第4节中的<notification>元素的模式,使用XSD中定义的XML名称空间,如下所示:
urn:ietf:params:xml:ns:netconf:notification:1.0
对于JSON编码目的,“notification”元素的模块名称是“ietf-restconf”。
预计“notification”容器中有两个子节点,代表事件时间和事件有效负载。 “eventTime”节点在与<notification>元素相同的XML名称空间内定义。它被定义在用于JSON编码目的的“ietf-restconf”模块名称空间内。
有效载荷元素的名称和名称空间由包含表示通知消息的notification-stmt的YANG模块确定。
在下面的例子中,使用了YANG模块“example-mod”:
module example-mod {
namespace "http://example.com/event/1.0";
prefix ex;
organization "Example, Inc.";
contact "support at example.com";
description "Example Notification Data Model Module.";
revision "2016-07-07" {
description "Initial version.";
reference "example.com document 2-9976.";
}
notification event {
description "Example notification event.";
leaf event-class {
type string;
description "Event class identifier.";
}
container reporting-entity {
description "Event specific information.";
leaf card {
type string;
description "Line card identifier.";
}
}
leaf severity {
type string;
description "Event severity description.";
}
}
}
使用XML编码的示例SSE事件通知:
data: <notification
data: xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
data: <eventTime>2013-12-21T00:01:00Z</eventTime>
data: <event xmlns="http://example.com/event/1.0">
data: <event-class>fault</event-class>
data: <reporting-entity>
data: <card>Ethernet0</card>
data: </reporting-entity>
data: <severity>major</severity>
data: </event>
data: </notification>
使用JSON编码的示例SSE事件通知:
data: {
data: "ietf-restconf:notification" : {
data: "eventTime" : "2013-12-21T00:01:00Z",
data: "example-mod:event" : {
data: "event-class" : "fault",
data: "reporting-entity" : { "card" : "Ethernet0" },
data: "severity" : "major"
data: }
data: }
data: }
或者,既然XML和JSON都不是对空格敏感的,上面的消息可以被编码到一行中。 例如:
XML:
data: <notification xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0"><eventTime>2013-12-21T00:01:00Z</eventTime><event xmlns="http://example.com/event/1.0"><event-class>fault</event-class><reportingEntity><card>Ethernet0</card></reporting-entity><severity>major</severity></event></notification>
JSON:
data: {"ietf-restconf:notification":{"eventTime":"2013-12-21T00:01:00Z","example-mod:event":{"event-class": "fault","reportingEntity":{"card":"Ethernet0"},"severity":"major"}}}
SSE规范支持以下附加字段:“event”,“id”和“retry”。 RESTCONF服务器可以发送“retry”字段,如果是的话,RESTCONF客户端应该使用它。 RESTCONF服务器不应该发送“event”或“id”字段,因为没有可用于它们的有意义的值,这对通知本身的内容不会是多余的。 不发送“id”字段的RESTCONF服务器也不需要支持HTTP头字段“Last-Event-ID”[W3C.REC-eventsource-20150203]。 发送“id”字段的RESTCONF服务器应该支持“start-time”查询参数,作为客户端指定重新启动事件流的首选方式。