HTTP Маршрутизация телефонных вызовов
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",
Далее добавить в контекст маршрутизации правило вида:
<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>
В этом правиле говорится, что в случае совпадения условий, выполнить внешнюю 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]
Далее создаем контекст маршрутизации, который будет обращаться к данным серверам по 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>
Таким образом при совершении звонка, ECSS-10 произведет обращение к серверам 2gis, Yandex. При получении ответа от сервера, в котором содержится DisplayName, ECSS-10 производит подстановку данной информации в cgpn DisplayName.