Использование технологии websocket
Для того чтобы иметь возможность взаимодействовать с API колл-центра, необходимо открыть websocket-соединение до proxy-сервера.
Proxy-сервер это nodejs-приложение которое доступно после установки пакета ecss-cc-ui, доступно по wss://<ecss-cc-ui_ip>:<ecss-cc-ui_port>.
Порт задается при установке пакета ecss-cc-ui, по умолчанию 8091.
Например, используя реализацию rxjs/webSocket, это можно сделать так:
this.ws = webSocket(this.url)
this.ws.subscribe(
(response: EltexResponse<any>) => this.fullDataStream.next(response),
() => this._reconnectStream.next(),
() => this._reconnectStream.next(),
)
Pcap такого вызова выглядит следующим образом:
GET / HTTP/1.1
Host: 192.168.116.130:8091
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Upgrade: websocket
Origin: 192.168.116.130:4200
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate, br
Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: csrftoken=use5JWejQXZB1tx9lYKfsZzOXOHTnbs0YtkcOBxQZDIbkyn7BRdC6SHxpOGH2Vey; JSESSIONID=node0zeowgwu8yiu618sgj0akvjq771.node0; wcf_sid=quvcn3kzptuaqd8signl09uuh0mul5ec
Sec-WebSocket-Key: A6Ljrs3D5xFKKQcym5R9Yw==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: /8tybArQZvyYCIM+33XZ37yw/Rw=
Протокол общения
Существует два типа входящих запросов
- Запрос-ответ
- Запрос-ответ для подписки на уведомления + после такого запроса приходят уведомления по подписке
Входящие запросы
interface EltexRequest { /** * Имя команды (url). */ action: string /** * Идентификатор запроса, должен быть уникальным значением, равен или больше нуля. */ requestId: number /** * Дополнительные параметры запроса */ payload: object }
Ответы на запросы
interface EltexResponse<T> { /** * Имя команды, идентично запросу, либо неизвестное ранее значение для уведомлений или критических ошибок */ action: string /** * Идентификатор запроса, либо 0 для уведомлений */ requestId: number /** * Полезная нагрузка, объект, строка, или null */ payload: T /** * Статус: 200 ОК, 401 неверные авторизационные данные, 500 для ошибок и 403 если сервер закрыл сессию пользователя */ status: number }
Для большинства запросов требуется предварительная авторизация.
Команды не требующие авторизации:
login, auth, profile
.
Уведомления по подписке присылаются с requestId = 0
.
Параметры для запроса передаются в payload
в виде вложенных объектов.
Сразу после login ecss-cc-ui-api открывает webcosket для получения данных от сервера и передачи команд от пользователя.
GET /dom1/service/cc/arm/websockets HTTP/1.1
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: wP+FlPkzHDC0bA/mzkrkFQ==
Connection: Upgrade
Upgrade: websocket
Cookie: token=064803c90ec3b72b; Version=1; Path=/
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Host: 10.25.64.21:8086
HTTP/1.1 101 Switching Protocols
connection: Upgrade
upgrade: websocket
sec-websocket-accept: w3h/LIiEKYiZDyFqIiH2Lk8HEHI=