Проблемы с REST при подключении через room api

Aleksandr

New Member
Добрый день, перед нами стоит задача записи сообщений чата в базу данных при работе через room api.
Что мы сделали: Создали по образцу приложение в WCS с адресом нашего вебсервера, прописали в это приложение все rest методы, создали на стороне вебсервера контроллер, который возвращает при запросе от WCS rest connect полученные данные плюс restClientConfig и код 200, изменили AppKey в параметре ROOM_REST_APP flashphoner.js на тот, который описали при создании приложения в WCS.
В результате пользователь перестал добавляться в room и работа в комнате стала невозможной. Если изменяем ключ в flashphoner.js на тот, что был прежде - "roomApp", то работать с комнатой можно, но мы теряем возможность следить за процессами на стороне вебсервера. Подскажите, как правильно организовать взаимодействие WCS с нашим вебсервером при работе через room api.
 

Max

Administrator
Staff member
Здесь два варианта

Вариант 1
Не использовать Room API
Room API построено на вызовах
На стороне клиента Web SDK
Flashphoner.createSession()
session.createStream().play()
session.createStream().publish()
session.createStream().sendData()
На стороне REST Methods
/connect
/playStream
/publishStream
/OnDataEvent
На стороне REST API
/data/send

Т.е. вам нужно реализовать контроллеры для 4 методов.
В этом случае вы сможете полностью контроллировать ваши "комнаты".

Вариант 2
Реализовать ваше приложение так, чтобы оно было размещено "перед" нашим стандартным REST-приложением http://localhost:9091/RoomApp
Т.е. должно работать так.
Browser - [Websocket] - WCS - [REST/HTTP] - YourApp - [REST/HTTP] - RoomApp
Т.е. ваше приложение все запросы делегирует нашему RoomApp: http://localhost:9091/RoomApp
И полученные от RoomApp ответы делегирует WCS серверу.
В этом случае вы легко можете перехватывать / записывать сообщения и сохранить при этом работу комнат.
 

Aleksandr

New Member
Интересен второй вариант. Только не совсем понятно, как можно разместить наше приложение "перед" RoomApp. Если размещать физически, то следовательно нужно удалять приложения, предшествующие RoomApp, что может повлечь за собой непредсказуемые последствия. Если размещать логически, то не совсем понятна организация этого процесса: если я правильно понял, то вы рекомендуете вызывать rest api дважды, один раз с именем ключа нашего приложения, а затем вызвать второй раз, но уже с именем RoomApp? Или я что-то не так понял?
 

Max

Administrator
Staff member
то вы рекомендуете вызывать rest api дважды, один раз с именем ключа нашего приложения, а затем вызвать второй раз, но уже с именем RoomApp? Или я что-то не так понял?
Нет, не так. Вот картинка.
Ваше приложение принимает запрос от WCS и перенаправляет этот запрос на RoomApp. Далее получает от RoomApp ответ и отправляет на WCS.
В этом случае, оно сможет перехватывать Request / Response и записывать сообщения или вводить какие-то кастомные аутентификации, например запретить коннект, если переданный токен не подошел.
middle-app.jpg
 

Aleksandr

New Member
В целом схема прозрачна, за исключением механизма работы с адресами: наш вебсервер имеет конкретное доменное имя https://sitename.com, WCS расположен на другом сервере с адресом https://stream.sitename.com, а приложению RoomApp соответствует адрес http://localhost:9091/RoomApp (или https://localhost:8888/RoomApp для защищенного соединения) - вопрос куда и как должно отсылать запрос наше приложение на вебсервере, чтобы схема заработала правильно?
 

Aleksandr

New Member
При обращении от нашего вебсервера к адресу http://[URL='https://stream.sitename.com/']stream.sitename.com:9091/RoomApp[/URL] с параметрами в POST и Content-Type: application/json получаем ответ "метод не поддерживается":
Ответ от WCS->Requests_Response::__set_state(array(
'body' => '{"timestamp":1494662917120,"status":405,"error":"Method Not Allowed","exception":"org.springframework.web.HttpRequestMethodNotSupportedException","message":"Request method \'POST\' not supported","path":"/RoomApp"}',
'raw' => 'HTTP/1.1 405 Method Not Allowed
Server: Apache-Coyote/1.1
Allow: HEAD, GET
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Sat, 13 May 2017 08:08:37 GMT
Connection: close

Что мы делаем не так?
 

Max

Administrator
Staff member
Такого адреса действительно нет:
Code:
http://stream.sitename.com:9091/RoomApp
Есть адреса:
Code:
http://stream.sitename.com:9091/RoomApp/connect
http://stream.sitename.com:9091/RoomApp/ConnectionStatusEvent
http://stream.sitename.com:9091/RoomApp/playStream
и.т.д.
Если будете высылать запросы на них, все должно заработать.

Вы можете также снять полный дамп теста примера https://wcs5-eu.flashphoner.com/demo2/video-chat, который построен на Room API.
Code:
 tcpdump port 9091 -i lo -w log.pcap
В pcap файле видно как и какие параметры передаются. Пример pcap-файла в аттаче (можно открыть Wireshark).

pcap-img.jpg
 

Attachments

Top