Реализация передачи данных по websocket выполнена при помощи библиотеки https://socket.io.
Примечание: символ ~/ будет означать корневой адрес
Шаг 1. Подключение библиотеки socket.io
<script src="~/socket.io/socket.io.js"></script>
Шаг 2. Инициализация соединения
var socket = io.connect('http://domain.com', {
path: '/virtaulPath' + '/socket.io',
transports: ['websocket']
});
, где
- http://domain.com — корневой адрес сервиса
- ‘/virtualPath’ — виртуальная директория, если есть, иначе String.Empty
Шаг 3. Регистрация пользователя на сервере.
Данный шаг требуется для последующей идентификации пользователя. Суть этого шага состоит в том, что нужно вызвать любой запрос на сервере, например получение текущего серверного времени.
socket.emit('rpc', {
namespace: 'PN',
action: 'shell',
method: 'getServerTime',
data: null,
token: 'текущий токен авторизации' // он и нужен нам
});
, где:
- namespace: string — пространство имен, где хранятся удаленные процедуры. По умолчанию PN
- action: string — имя области (действия)
- method: string — имя метода
- data: any — данные для обработки на сервере. Список элементов уточнять у разработчика методов.
- token: string — токен авторизации. Его следует передавать каждый раз при выполнении запроса.
Примечание: полный перечень методов можно получить вызвав запрос GET ~/rpc/meta, который доступен авторизованным пользователям.
Далее подписываемся на событие ответа от сервера.
socket.on('PN.shell.getServerTime', function(obj) { // (1)
if(obj.code == 200) {
// (2) Регистрация прошла успешно
}
});
Имя события (1) на которое надо подписываться именуется из сложения строк.
var eventName = namespace + '.' + action + '.' + method;
Результатом ответа будет объект (2), который имеет следующую структуру:
- meta: any — мета информация socket запроса
- processed: boolean — если true, то значит операция завершена полностью, иначе требуется дожидаться следующего ответа.
- status: string — строка со статусом выполнения операции
socket.io(evantName, function(obj) {
if(obj.meta.processed == false) {
// тут может отображаться статус выполнения операции
console.log(obj.meta.status);
} else {
// значит операция была завершена
}
});
- data: any — содержит мету информацию выполнения RPC запроса
- success: boolean — результат выполнения RPC — запроса
- msg: string — текст сообщения
- result: any — результат выполнения запроса
- code: number — код выполнения
- 200 — запрос выполнено удачно
- 401 — не авторизован
- 500 — ошибка выполнения
Шаг 4. Тестирование уведомлений
Подписываемся на соответствующее событие:
socket.on('notifiction', function(obj) {
if(obj.meta.processed == true) {
console.log(obj.result.title);
console.log(obj.result.message);
}
});
Для тестирования механизма уведомлений есть тестовый адрес:
GET ~/notification/test?username=[user]&message=[message];
, где:
- username: string — логин пользователя
- message: string — текст сообщения
В результате вызова запроса, обработчик должен его перехватить и вывести результат в консоли.