# Встроенный HTTP сервер
# Общее описание
Поскольку VideoSDK/Room управляется удаленно c помощью клиент-серверного протокола WebSocket, в состав приложения входит HTTP сервер. Он запускается автоматически при запуске приложения. Порт для него также будет выбран автоматически и его значение можно будет получить с помощью API метода getHttpServerSettings
. Но вы можете указать порт вручную. Для этого при запуске VideoSDK/Room задайте нужное значение в параметре командной строки --httpport
. Если запуск HTTP сервера на указанном порту не удался, то приложение не запустится и в логи будут выведены соответствующие сообщения.
HTTP сервер используется для следующего функционала:
Каждый функционал поддерживает свой набор HTTP методов, с которым можно ознакомиться в соответствующем разделе. Все без исключения запросы должны передавать параметр token
, который создается и получается:
в процессе авторизации – значение поля
tokenForHttpServer
в ответе на успешную авторизацию командой auth;в процессе перехода из типа управления администратор в тип управления пользователь – значение поля
tokenForHttpServer
в ответе на успешное выполнение команды auth;при успешном выполнении команды getTokenForHttpServer – значение поля
token
;при установке нового типа защиты для входа в управление – значение поля
tokenForHttpServer
в ответе на успешное выполнение команды setAuthParams.
В результате выполнения запросов возвращаются определённые коды и сообщения, которые рассмотрены ниже.
Время жизни токена – 5 минут, или до выключения приложения, или до получения нотификации authorizationNeeded. Если управление осуществляется с выставленной защитой По пину, тогда время жизни токена не истекает до перезагрузки приложения. Очистка токенов может быть сделана с помощью выполнения команды clearTokens.
# Управление HTTP сервером
Вы можете управлять состоянием HTTP сервера при работе VideoSDK/Room:
получить текущий статус командой getHttpServerState;
запустить его командой startHttpServer;
остановить командой stopHttpServer.
При смене состояния HTTP сервера будет получена нотификация httpServerStateChanged.
Также HTTP сервер может настраиваться с помощью таких команд: получение настроек (getHttpServerSettings), установка настроек (setHttpServerSettings), а также нотификация об их изменении (httpServerSettingChanged).
Все HTTP запросы имеют следующий формат:
http://room_ip:port/functionalityTag?params&token=tokenValue
# Описание параметров
room_ip
– ip адрес устройства, где запущен VideoSDK/Roomport
– порт, по которому слушает HTTP сервер. Можно получить из:значения поля
embeddedHttpPort
в ответе на успешное выполнение метода getAppStateзначения поля
embeddedHttpPort
нотификации appStateChangedобъекта со значением имени поля
name
и его значениемport
в ответе на успешное выполнение команды getHttpServerSettingsобъекта со значением имени поля
name
и его значениемport
в нотификации httpServerSettingChangedтого же файла
config.json
где содержится и WebSocket порт
functionalityTag
– тег требуемого функционалаparams
– набор параметров, специфичных для конкретного функционала (тега)token
– токен
Есть возможность задать вручную другой порт с помощью команды setHttpServerSettings.
Далее показано, какие HTTP-запросы какого типа (GET, HEAD, POST, OPTIONS, DELETE) надо выполнять для каждой задачи.
# Получение данных об HTTP сервере
Метод OPTIONS в HTTP используется для получения информации о возможностях веб-сервера и поддерживаемых им методах. Этот запрос не изменяет состояние сервера или ресурса, а только возвращает метаданные, такие как разрешенные методы HTTP, поддерживаемые версии протокола и дополнительные заголовки, которые могут быть использованы для настройки запросов.
Выполните OPTIONS запрос формата
http://room_ip:port/files?token=tokenValue
Описание параметров
room_ip
,port
,token
- стандартные параметры, описанные выше
# Работа с кадрами камер
Для работы с кадрами с текущего устройства захвата видео и кадрами участников конференций используются запросы, отправленные на /frames
. HTTP сервер сам собирает эти кадры и нет необходимости как-то их добавлять, обновлять или удалять – все будет сделано автоматически.
Для каждого участника конференции сохраняется один последний кадр, то есть они не накапливаются. После завершения мероприятия кадры участников удаляются, но остаются свои (с камеры ).
# Получение кадров
Выполните GET или HEAD запрос формата
http://room_ip:port/frames?peerId=requiredPeerId&token=tokenValue
Описание параметров
room_ip
,port
,token
- стандартные параметры, описанные вышеpeerId
- идентификатор участника конференции, чей кадр нужно получить. Для получения кадров из устройства захвата видео следует передать одно из значений:#self:0
, которое будет валидным в любом состоянии приложения (залогинено или нет, онлайн или в конференции и т.п.)идентификатор, с которым произведена авторизация на сервере. Его можно узнать, например, из значения поля
peerId
, полученного в результате успешного выполнения метода getLogin или нотификации login.
# Аватары пользователей
Для работы с аватарами пользователей используются запросы, отправленные на /avatars
. HTTP сервер сам собирает их и нет необходимости как-то их добавлять, обновлять или удалять – все будет сделано автоматически. Обновление аватара можно отследить путем обработки нотификации updateAvatar.
# Получение аватаров
Выполните GET или HEAD запрос формата
http://room_ip:port/avatars?peerId=requiredPeerId&token=tokenValue
Описание параметров
room_ip
,port
,token
- стандартные параметры, описанные вышеpeerId
- идентификатор пользователя, чей аватар нужно получить
# Пресеты устройства захвата видео
При каждом сохранении пресета командой addPresetFromCurrentVideoCapturer на HTTP сервере также сохраняется скриншот с текущего устройства захвата видео. Для работы с пресетами используются запросы, отправленные на /videoCapturerPresets
. HTTP сервер сам собирает их и нет необходимости как-то их добавлять, обновлять или удалять – все будет сделано автоматически, при работе с пресетами через API-команды.
# Получение кадра пресета
Выполните GET или HEAD запрос формата
http://room_ip:port/videoCapturerPresets?presetId=requiredPresetId&token=tokenValue
Описание параметров
room_ip
,port
,token
– стандартные параметры, описанные вышеpresetId
– идентификатор пресета, чей скриншот нужно получить
# Файлы
HTTP сервер умеет работать с файлами. Это может понадобиться для разных целей: передача файлов в чате, показ слайдшоу, замена фона и т.п. Работа с ними организована с помощью уникальных идентификаторов – fileId
. Это позволяет хранить и работать с абсолютно одинаковыми файлами. Список всех доступных файлов можно получить, выполнив API команду getFileList
# Получение файла
Выполните GET запрос формата
http://room_ip:port/files?fileId=requiredFileId&token=tokenValue
Пример запроса
http://192.168.0.100:8766/files?fileId=42488041&token=4*t5rfZVQYzPCMZAcZ*124795274*3730373132354636433231444639353037353935413044303743453246393130
Описание параметров
room_ip
,port
,token
– стандартные параметры, описанные вышеfileId
– идентификатор файла, который нужно получить
Также в ответе в заголовках будет указано оригинальное имя файла, например, Content-Disposition: attachment; filename="Screenshot_20221205_062944.png"
.
# Загрузка файлов на веб-сервер
Выполните POST запрос формата
http://room_ip:port/files?token=tokenValue
При этом в HTML надо будет указать формат multipart/form-data
и указать путь к файлу. При использовании утилиты curl (opens new window) надо будет указать ключ --form
.
Пример загрузки файла с использованием утилиты curl
(opens new window)
curl --form 'file=@"/home/user/image.png"' http://192.168.0.100:8766/files?token=4*t5rfZVQYzPCMZAcZ*124795274*3730373132354636433231444639353037353935413044303743453246393130
Пример формы на html-странице
<form action="http://192.168.0.100:8766/files?token=4*t5rfZVQYzPCMZAcZ*124795274*3730373132354636433231444639353037353935413044303743453246393130" enctype="multipart/form-data" method="POST">
<div>
<label for="file">Choose file to upload</label>
<input type="file" id="file" name="file" multiple>
</div>
<div>
<button>Submit</button>
</div>
</form>
Описание параметров
room_ip
,port
,token
- стандартные параметры, описанные выше
При успешной загрузке в ответе будет содержаться идентификатор / идентификаторы, которые присвоились файлу / файлам на HTTP сервере и должны использоваться далее при работе с ними (в часности, в API).
Access-Control-Expose-Headers: FileId, ErrorMessage, ErrorCode
ErrorCode: 0
ErrorMessage: Success
FileId: 50627163
Access-Control-Expose-Headers: UnpackedFilesId, ErrorMessage, ErrorCode
ErrorCode: 0
ErrorMessage: Success
UnpackedFilesId: 153153427,153154947,153154948,153154949,153154950
Описание параметров
Access-Control-Expose-Headers
- список дополнительных заголовков с информацией о выполнении методаfileId
- идентификатор файла на сервере. Присутствует только если загружаемому файлу будет соответствовать один файл на сервереUnpackedFilesId
- идентификаторы файлов на сервере. Присутствует только если загружаемый файл распаковывается в несколько других, например при загрузке слайдов из файла презентацииMicrosoft PowerPoint
или файла презентации, сделанного вTrueConf Client
Также POST запрос может использоваться для удаления файлов с HTTP сервера, используя "старый формат".
Формат url запроса
http://room_ip:port/files?fileId=requiredFileId&action=DELETE
Описание параметров
room_ip
,port
,token
- стандартные параметры, описанные вышеfileId
- идентификатор файла, который нужно удалитьaction=DELETE
- указание на то, что мы должны удалить файл
# Удаление файла
Для удаления файла требуется выполнить DELETE-запрос вида:
http://room_ip:port/files?fileId=requiredFileId&token=tokenValue
Описание параметров
fileId
– идентификатор (ID) файла, который нужно удалить. Список всех доступных файлов и их идентификаторов можно получить, выполнив API команду getFileList. Также ID возвращается при успешной загрузке файла с помощью POST-запроса.
# Наложение
С помощью наложения мы можете разместить изображение поверх исходящего от видеопотока.
# Получение файла
Выполните GET или HEAD запрос формата
http://room_ip:port/overlay?type=drawing&imageId=someId&token=tokenValue
http://room_ip:port/overlay?type=original_frames&peerId=someId&token=tokenValue
Пример запроса
http://192.168.0.100:8766/overlay?type=drawing&imageId=42488041&token=4*t5rfZVQYzPCMZAcZ*124795274*3730373132354636433231444639353037353935413044303743453246393130
http://192.168.0.100:8766/overlay?type=original_frames&peerId=user1@some.server&token=4*t5rfZVQYzPCMZAcZ*124795274*3730373132354636433231444639353037353935413044303743453246393130
Описание параметров
imageId
– идентификатор файла, который нужно наложить поверх видеопотокаpeerId
– уникальный идентификатор источника кадров (участники конференции, а также свое собственное видео)type
– нужная часть функционала Наложения
# Загрузка файлов на веб-сервер
http://room_ip:port/overlay?type=drawing&imageId=someId&token=tokenValue
Пример запроса
http://192.168.0.100:8766/overlay?type=drawing&imageId=42488041&token=4*t5rfZVQYzPCMZAcZ*124795274*3730373132354636433231444639353037353935413044303743453246393130
Описание параметров
imageId
– идентификатор файла, который нужно наложить поверх видеопотокаtype
– нужная часть функционала Наложения
# Удаление файла
Для удаления файла требуется выполнить DELETE-запрос вида:
http://room_ip:port/overlay?type=drawing&imageId=someId&token=tokenValue
Пример запроса
http://192.168.0.100:8766/overlay?type=drawing&imageId=42488041&token=4*t5rfZVQYzPCMZAcZ*124795274*3730373132354636433231444639353037353935413044303743453246393130
Описание параметров
imageId
– идентификатор файла, который нужно удалитьtype
– нужная часть функционала Наложения
# Слайдшоу
Реализованы те же функции, что и при работе с файлами, но в запросах подставляется тег slides
вместо files
. Используется для подготовки слайдшоу, чтобы передавать его во время конференции или звонка.
При загрузке файла он будет проверен на возможность использования: поддерживаются изображения .jpg, .jpeg, .png, .webp, .gif, а также файлы презентаций Microsoft PowerPoint .ppt, .pptx и специального формата .slides (как их получить смотрите в документации клиентского приложения TrueConf). Если такой тип файла не поддерживается, вернется ошибка 422 Unprocessable Entity
. При загрузке файла презентации он будет распакован в отдельные файлы-слайды, а в ответе в заголовке UnpackedFilesId
будет выдан их список.
# Замена фона
Загрузка файлов на HTTP сервер также требуется для использования замены фона. Перед выполнением команды setBackground требуется добавить изображение одного из поддерживаемых форматов: .jpg, .jpeg, .png, .svg как было показано выше.
# Возвращаемый результат и заголовки http запросов
Абсолютно все http запросы в ответе будут возвращать дополнительные заголовки, которые будут указывать на результат выполнения.
ErrorCode
- код, обозначающий результат выполненияErrorMessage
- текстовое описание результата выполненияExtraErrorCode
- дополнительный код, обозначающий результат выполнения и который указывает на внутреннее состояние сервера в исключительных ситуациях. Может использоваться для анализа проблем при выполнении запросаExtraErrorDescription
- дополнительное текстовое описание результата выполнения, обозначающее результат выполнения и который указывает на внутреннее состояние сервера в исключительных ситуациях. Может использоваться для анализа проблем при выполнении запроса
ErrorCode
и ErrorMessage
выдаются взаимосвязанными парами и могут принимать следующие значения:
ErrorCode: 0
,ErrorMessage: Success
- успех, ошибок не произошлоErrorCode: 1
,ErrorMessage: Token is not present
- ошибка. Токен не был передан в запросErrorCode: 2
,ErrorMessage: Invalid token
- ошибка. Переданный в запрос токен - не валидныйErrorCode: 3
,ErrorMessage: Tag is not present
- ошибка. В запросе не был указан тегErrorCode: 4
,ErrorMessage: This method is not allowed
- ошибка. Такой тип запроса не поддерживается на таком тегеErrorCode: 5
,ErrorMessage: 'peerId' parameter is not present
- ошибка. В запросе отсутствует обязательный параметр 'peerId'ErrorCode: 6
,ErrorMessage: 'peerId' parameter must be not empty
- ошибка. В запросе обязательный параметр 'peerId' пустойErrorCode: 7
,ErrorMessage: Avatar for such peerId was not found
- ошибка. Аватар для указанного отсутствуетErrorCode: 8
,ErrorMessage: Frame for such peerId was not found
- ошибка. Кадр для указанного участника отсутствуетErrorCode: 9
,ErrorMessage: 'presetId' parameter is not present
- ошибка. В запросе отсутствует обязательный параметр 'presetId'ErrorCode: 10
,ErrorMessage: 'presetId' parameter must be not empty
- ошибка. В запросе обязательный параметр 'presetId' пустойErrorCode: 11
,ErrorMessage: Video capturer presets locking failure
- ошибка. Внутренний сбой сервера, связанный с получением информации о пресетах (не смогли получить объект, который ими управляет)ErrorCode: 12
,ErrorMessage: An error occurred while getting video capturer preset
- ошибка. Внутренний сбой сервера, связанный с получением информации о пресетах (ошибка получения конкретного пресета)ErrorCode: 13
,ErrorMessage: Video capturer preset doesn't contain preview image
- ошибка. Внутренний сбой сервера, связанный с получением информации о пресетах (полученный пресет не содержит превью)ErrorCode: 14
,ErrorMessage: 'fileId' parameter is not present
- ошибка. В запросе отсутствует обязательный параметр 'fileId'ErrorCode: 15
,ErrorMessage: 'fileId' parameter must be not empty
- ошибка. В запросе обязательный параметр 'fileId' пустойErrorCode: 16
,ErrorMessage: An error occurred while getting information about the file by its id
- ошибка. Внутренний сбой сервера, связанный с получением информации о файле по его идентификаторуErrorCode: 17
,ErrorMessage: An error occurred while creating response content callback
- ошибка. Внутренний сбой сервера, связанный с обработкой запроса (не смогли создать структуру ответа)ErrorCode: 18
,ErrorMessage: An error occurred while creating Request struct
- ошибка. Внутренний сбой сервера, связанный с обработкой запроса (не смогли создать структуру запроса)ErrorCode: 19
,ErrorMessage: An error occurred while creating RequestInfo struct
- ошибка. Внутренний сбой сервера, связанный с обработкой запроса (не смогли создать структуру информации запроса)ErrorCode: 20
,ErrorMessage: file.good check failure
- ошибка. Внутренний сбой сервера, связанный с работой с файловой системой (проверка флагов состояния файла)ErrorCode: 21
,ErrorMessage: file.tellg check failure
- ошибка. Внутренний сбой сервера, связанный с работой с файловой системой (работа с позицией текущего символа во входном потоке)ErrorCode: 22
,ErrorMessage: An error occurred while creating PostConnectionInfo struct
- ошибка. Внутренний сбой сервера, связанный с обработкой POST запроса (не смогли создать структуру с информацией о запросе)ErrorCode: 23
,ErrorMessage: An error occurred while creating post processor
- ошибка. Внутренний сбой сервера, связанный с обработкой POST запроса (не смогли создать объект обработки запроса)ErrorCode: 24
,ErrorMessage: An error occurred while processing post request
- ошибка. Внутренний сбой сервера, связанный с обработкой POST запроса (внутренняя ошибка библиотеки)ErrorCode: 25
,ErrorMessage: AfterDownloadFileValidationFunction returned failure
- ошибка. После загрузки файл был проверен в соответствии с правилами и условиями конкретного тега и эту проверку не прошелErrorCode: 26
,ErrorMessage: remove_all call failure
- ошибка. Внутренний сбой сервера, связанный с работой с файловой системой (ошибка удаления рабочей временной директории)ErrorCode: 27
,ErrorMessage: File key is not present
- ошибка. В запросе отсутствует обязательный параметр 'file'ErrorCode: 28
,ErrorMessage: 'fileName' parameter is not present
- ошибка. В запросе отсутствует обязательный параметр 'fileName'ErrorCode: 29
,ErrorMessage: 'fileName' parameter must be not empty
- ошибка. В запросе обязательный параметр 'fileName' пустойErrorCode: 30
,ErrorMessage: PreDownloadFileValidationFunctionFailure returned failure
- ошибка. Перед началом загрузки файл был проверен в соответствии с правилами и условиями конкретного тега и эту проверку не прошелErrorCode: 31
,ErrorMessage: An error occurred while creating path for file
- ошибка. Внутренний сбой сервера, связанный с работой с файловой системой (ошибка создания директории, которая учавствует в логике обработки)ErrorCode: 32
,ErrorMessage: An error occurred because of unopened file
- ошибка. Внутренний сбой сервера, связанный с работой с файловой системой (ошибка открытия требуемого файла)ErrorCode: 33
,ErrorMessage: 'imageId' parameter is not present
- ошибка. В запросе отсутствует обязательный параметр 'imageId'ErrorCode: 34
,ErrorMessage: 'imageId' parameter must be not empty
- ошибка. В запросе обязательный параметр 'imageId' пустойErrorCode: 35
,ErrorMessage: An error occurred while loading png for overlay functionality
- ошибка. Внутренний сбой сервера, связанный с обработкой png файла (внутренняя ошибка библиотеки)ErrorCode: 36
,ErrorMessage: Loaded png file for overlay functionality have invalid size
- ошибка. Переданный файл имеет невалидный размер для функционала НаложенияErrorCode: 37
,ErrorMessage: An error occurred while adding png file to overlay functionality
- ошибка. Объект работы с функционалом Наложения вернул ошибку при добавлении нового файлаErrorCode: 38
,ErrorMessage: An error occurred while deleting png file from overlay functionality
- ошибка. Объект работы с функционалом Наложения вернул ошибку при удалении файлаErrorCode: 39
,ErrorMessage: Internal error - couldn't lock overlay video processing
- ошибка. Внутренний сбой сервера, связанный с работой функционала Наложения (не смогли получить объект, который им управляет)
См. также: