6.4. 接收事件通知

RESTCONF通知根据事件流的定义进行编码。

事件数据的结构基于[RFC5277]的第4节中的<notification>元素定义。它必须符合[RFC5277]的第4节中的<notification>元素的模式,使用XSD中定义的XML名称空间,如下所示:

  1. urn:ietf:params:xml:ns:netconf:notification:1.0

对于JSON编码目的,“notification”元素的模块名称是“ietf-restconf”。

预计“notification”容器中有两个子节点,代表事件时间和事件有效负载。 “eventTime”节点在与<notification>元素相同的XML名称空间内定义。它被定义在用于JSON编码目的的“ietf-restconf”模块名称空间内。

有效载荷元素的名称和名称空间由包含表示通知消息的notification-stmtYANG模块确定。

在下面的例子中,使用了YANG模块“example-mod”:

  1. module example-mod {
  2. namespace "http://example.com/event/1.0";
  3. prefix ex;
  4. organization "Example, Inc.";
  5. contact "support at example.com";
  6. description "Example Notification Data Model Module.";
  7. revision "2016-07-07" {
  8. description "Initial version.";
  9. reference "example.com document 2-9976.";
  10. }
  11. notification event {
  12. description "Example notification event.";
  13. leaf event-class {
  14. type string;
  15. description "Event class identifier.";
  16. }
  17. container reporting-entity {
  18. description "Event specific information.";
  19. leaf card {
  20. type string;
  21. description "Line card identifier.";
  22. }
  23. }
  24. leaf severity {
  25. type string;
  26. description "Event severity description.";
  27. }
  28. }
  29. }

使用XML编码的示例SSE事件通知:

  1. data: <notification
  2. data: xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
  3. data: <eventTime>2013-12-21T00:01:00Z</eventTime>
  4. data: <event xmlns="http://example.com/event/1.0">
  5. data: <event-class>fault</event-class>
  6. data: <reporting-entity>
  7. data: <card>Ethernet0</card>
  8. data: </reporting-entity>
  9. data: <severity>major</severity>
  10. data: </event>
  11. data: </notification>

使用JSON编码的示例SSE事件通知:

  1. data: {
  2. data: "ietf-restconf:notification" : {
  3. data: "eventTime" : "2013-12-21T00:01:00Z",
  4. data: "example-mod:event" : {
  5. data: "event-class" : "fault",
  6. data: "reporting-entity" : { "card" : "Ethernet0" },
  7. data: "severity" : "major"
  8. data: }
  9. data: }
  10. data: }

或者,既然XMLJSON都不是对空格敏感的,上面的消息可以被编码到一行中。 例如:

XML:

  1. 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:

  1. 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”查询参数,作为客户端指定重新启动事件流的首选方式。