ECSS-10 существует возможность изменения параметров проходящего вызова при помощи команд от HTTP-сервера, посылаемых в ответ на http-запросы. Команды передаются в текстовом виде json с использованием Key-Value атрибутов. В общем виде формат атрибутов выглядит следующим образом:

При попадании вызова в action "Внешняя маршрутизация по http", на указанный сервер отправляется POST запрос с текущими параметрами вызова в теле сообщения:

{
    "cgpn:"102",
    "caller_id":"102",
    "cgpn_display_name":"Sidorov",
    "cdpn":"789",
    "domain":"test.domain",
    "iface_a":"054a20799850a72b",
    "tag":"default,
    "context":"local",
    "api_key":"sdtgywq398yhetg9831qy"
}

В случаи успешной маршрутизации в ответ с сервера ожидается 200 код. Если серверу необходимо изменить какой либо из параметров, в тело ответа помещается json с свойствами и значениями параметров вызова, которые необходимо изменить:

{
    "cgpn": "string", (опционально)
    "caller_id": "string", (опционально)
    "cgpn_display_name": "string", (опционально)
    "cdpn": "string", (опционально)
    "cdpn_display_name": "string", (опционально)
    "tag": "string", (опционально)
    "cgpn_numtype": "internationNumber" | "nationalNumber" | "subscriberNumber" | "unknown", (опционально)
    "cdpn_numtype": "internationNumber" | "nationalNumber" | "subscriberNumber" | "unknown", (опционально)
    "cgpn_plantype": "isdnTelephony" | "reserved1" | "reserved2" | "spare", (опционально)
    "cdpn_plantype": "isdnTelephony" | "reserved1" | "reserved2" | "spare", (опционально)
    "presentation": "presentationAllowed" | "presentationRestricted" | "addressNotAvailable" | "spare" (опционально)
}

Для того чтобы вызвать внешнюю маршрутизации на ECSS-10, в контексте маршрутизации необходимо задекларировать http сервер:

/domain/DEV_DOM/routing/http/declare routeHttp http://10.40.12.140:9990/route/actions_external_routing --api-key sdtgywq398yhetg9831qy",
CODE

Далее добавить в контекст маршрутизации правило вида:

<rule name="to_HTTP_routing">
   <conditions>
     ...
   </conditions>
   <actions>
         <external_routing id="routeHttp" service="http_route_service" timeout="5000"/>
   </actions>
   <result>
      <continue context="ctx_after_http"/>
   </result>
</rule>
CODE

В этом правиле говорится, что в случае совпадения условий, выполнить внешнюю HTTP маршрутизацию на серверах с идентификаторами routeHttp. Команды для настройки HTTP серверов можно посмотреть тут. При этом на внешнюю маршрутизацию потратить не более 5000ms. По результатам выполнения HTTP запроса, продолжится ECSS маршрутизация в контексте ctx_after_http. Но с измененными cgpn, cdpn, tag (если эти поля были изменены в результате HTTP запроса). 

Если сервер вернет код не равный 200 или не ответит, маршрутизация продолжится так, будто HTTP сервер не поменял параметров вызова.

Если в секции Результат ("<result>") выполняется действие выставление тега, то фактически этот тег будет выставлен в секции Действия ("<actions>") и в запросе к HTTP серверу будет указан уже новый тег. 

Если в секции Действия ("<actions>") выполняется действие аналогичные действия выполняемым на сервере действует следующая логика:

  • выполняются действия в секции <actions>;
  • выполняется установка тега из <result>;
  • выполняется запрос к HTTP серверу, где в параметрах вызова указываются уже измененные параметры;
  • параметры вызова изменяются согласно указанным параметрам с сервера.

Пример получения DisplayName из внешней БД организаций от 2gis, Yandex и др.

Создаем HTTP-сервера для сервисов 2gis и Yandex:

admin@[mycelium1@ecss1#ECSS 010145]:/$ domain/DEV_DOM/routing/http/declare resolve-2gis http://system.restfs.ecss:9990/api/display-name-resolver/2gis --api-key 23214
HTTP routing server <<"resolve-2gis">> successfully declared.

[exec at: 13.05.2020 13:32:08, exec time: 133ms, nodes: ds1@ecss1]

admin@[mycelium1@ecss1#ECSS 010145]:/$ domain/refactor/routing/http/declare resolve-yandex http://system.restfs.ecss:9990/api/display-name-resolver/yandex --api-key 23312214
HTTP routing server "resolve-yandex" successfully declared.

[exec at: 13.05.2020 13:33:33, exec time: 83ms, nodes: ds1@ecss1]
CODE

Далее создаем контекст маршрутизации, который будет обращаться к данным серверам по HTTP:

<context xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="ecss_routing.xsd" name="http_server" digitmap="(*[0-9*][0-9*].#|#[0-9*][0-9*].#|*#[0-9*][0-9*].#|1xx.|10xx.)">
  <rule name="2gis">
    <actions>
      <external_routing service="http_route_service" id="resolve-2gis" args="{"proceed_on_failure":"true"}" timeout="1501"/>
    </actions>
    <result>
      <continue tag="lookup-yandex"/>
    </result>
  </rule>
  <rule name="yandex">
    <conditions>
      <tag value="lookup-yandex"/>
    </conditions>
    <actions>
      <external_routing service="http_route_service" id="resolve-yandex" args="{"proceed_on_failure":"true"}" timeout="1503"/>
    </actions>
    <result>
      <local/>
    </result>
  </rule>
</context>
CODE

Таким образом при совершении звонка, ECSS-10 произведет обращение к серверам 2gis, Yandex. При получении ответа от сервера, в котором содержится DisplayName, ECSS-10 производит подстановку данной информации в cgpn DisplayName.