Как сделать подписку Orion NGSIv2, которая уведомляет Cygnus в NGSIv1?

РЕДАКТИРОВАТЬ 2

curl  --include \
      --header 'Content-Type: application/json' \
      --request POST \
      --data-binary '{
                       "description": "Day subscription",
                       "subject": {
                         "entities": [
                           {
                             "idPattern": "es-leon-.*",
                             "type": "Event"
                           }
                         ],
                         "condition": {
                           "attrs": [
                              "Title",
                              "dFlag"
                           ],
                           "expression": {
                             "q": "dFlag>0"
                           }
                         }
                       },
                       "notification": {
                         "http": {
                             "url" : "http://localhost:5050/notify"
                         },
                         "attrs": [
                           "Title",
                           "dFlag"
                         ],
                         "attrsFormat":"legacy"
                       }
                     }' \
      'http://localhost:1026/v2/subscriptions'

В Orion подписка регистрируется нормально (спасибо за подсказки в комментариях), но у меня та же проблема, что и здесь, хотя я использую "attrsFormat":"legacy"Я что-то не так делаю? почему orion не использует ngsiv1 для отправки уведомления cygnus?

Трассировка ошибки Лебедя.

Лебедь показывает, что Орион отвечает на это:

{
    "subscriptionId": "574315e77775f31b8d3da719",
    "data": [{
        "id": "es-leon-0",
        "type": "Event",
        "Title": {
            "type": "none",
            "value": "pepe",
            "metadata": {}
        },
        "dFlag": {
            "type": "text",
            "value": "1",
            "metadata": {}
        }
    }]
}

Когда он должен ответить на строки ниже, чтобы быть в ngsiv1:

{
    "subscriptionId": "5743178d7775f31b8d3da71a",
    "originator": "localhost",
    "contextResponses": [{
        "contextElement": {
            "type": "Event",
            "isPattern": "false",
            "id": "es-leon-0",
            "attributes": [{
                "name": "Title",
                "type": "text",
                "value": "pep"
            }, {
                "name": "dFlag",
                "type": "text",
                "value": "1"
            }]
        },
        "statusCode": {
            "code": "200",
            "reasonPhrase": "OK"
        }
    }]
}

Оригинальный вопрос

Как сказано в другом вопросе:

РЕДАКТИРОВАТЬ: обратите внимание также, что вы можете использовать NGSIv2 для создания / обновления сущностей в Orion и получать уведомления в NGSIv1, если вы:

Создайте подписку, используя операции NGSIv1

Создайте подписку, используя операции NGSIv2 с attrsFormat, равным legacy. Посмотрите более подробную информацию здесь.

Итак, я составил эту подписку:

curl  --include \
      --header 'Content-Type: application/json' \
      --request POST \
      --data-binary '{
                       "description": "Day subscription",
                       "subject": {
                         "entities": [
                           {
                             "idPattern": "es-leon-.*",
                             "type": "Event"
                           }
                         ],
                         "condition": {
                           "attributes": [
                              "Title",
                              "dFlag"
                           ],
                           "expression": {
                             "q": "dFlag > 0"
                           }
                         }
                       },
                       "notification": {
                         "callback": "http://localhost:5050/notify",
                         "attributes": [
                           "Title",
                           "dFlag"
                         ]
                       }
                     }' \
      'http://localhost:1026/v1/subscriptions'

но orion не позволяет мне зарегистрировать это, выдав эту ошибку:

HTTP/1.1 400 Bad Request
Connection: Keep-Alive
Content-Length: 67
Content-Type: application/json
Fiware-Correlator: 2ecdfc74-1c2f-11e6-82d7-000d3a23bf27
Date: Tue, 17 May 2016 12:59:25 GMT

{"error":"BadRequest","description":"no condition attrs specified"}

Это способ использовать устаревшие атрибуты, чтобы он мог работать с Cygnus с NGSIv2? Спасибо за помощь.

РЕДАКТИРОВАТЬ 1:

После ответа подписка должна быть такой: Верно?

curl  --include \
      --header 'Content-Type: application/json' \
      --request POST \
      --data-binary '{
                       "description": "Day subscription",
                       "subject": {
                         "entities": [
                           {
                             "idPattern": "es-leon-.*",
                             "type": "Event"
                           }
                         ],
                         "condition": {
                           "attributes": [
                              "Title",
                              "dFlag"
                           ],
                           "expression": {
                             "q": "dFlag > 0"
                           }
                         }
                       },
                       "notification": {
                         "http": {
                             "url" : "http://localhost:5050/notify"
                         },
                         "attributes": [
                           "Title",
                           "dFlag"
                         ],
                         "attrsFormat":"legacy"
                       }
                     }' \
      'http://localhost:1026/v2/subscriptions'

Но я все еще получаю ошибку:

HTTP/1.1 100 Continue

HTTP/1.1 400 Bad Request
Connection: Keep-Alive
Content-Length: 67
Content-Type: application/json
Fiware-Correlator: 60a0a1d2-1ddf-11e6-8bd6-000d3a23bf27
Date: Thu, 19 May 2016 16:33:11 GMT

{"error":"BadRequest","description":"no condition attrs specified"}

1 ответ

Решение

Использование attrs вместо attributes (оба в subject.conditions И в notification).

Кроме того, обратите внимание, что callback больше не используется. Вы должны использовать:

"notification": {
  "http": {
    "url": "http://localhost:5050/notify"
  },
  ..
}

Кроме того, если вы хотите, чтобы уведомления использовали формат NGSIv1, вы должны включить attrsFormat поле со значением legacy в notification как описано в документации.

Наконец, обратите внимание, что URL-адрес RIGT операции /v2/subscriptionsне /v1/subscriptions как показано в вашем примере.

РЕДАКТИРОВАТЬ 1: учитывая новую полезную нагрузку в разделе РЕДАКТИРОВАТЬ 1 в вопросе, обратите внимание, что:

  • Вы должны использовать attrs внутри conditionне attributes (сообщение об ошибке жалуется на это)

  • Вы должны использовать attrs внутри notificationне attributes

  • Вы должны использовать "q": "dFlag>0" (т.е. без пробелов в строке запроса). Посмотрите на пример в спецификации NGSIv2:

Например:

"expression": {
  "q": "temperature>40"
}

РЕДАКТИРОВАТЬ 2: версии Orion до 1.2 использования attrsFormat вне notification поле. Таким образом, если вы используете Orion 1.1, попробуйте использовать "attrsFormat": "legacy" в качестве поля первого уровня в полезной нагрузке подписки JSON.

Другие вопросы по тегам