Предисловие
Доброго времени суток, друзья!
Недавно, задумавшись на тему дальнейшего саморазвития, поймал себя на мысли, что быть backend-разработчиком конечно замечательно, и мне это нравится, но вместе с тем остается ощущение, что ты многое упускаешь. Как вы уже наверное поняли, я имею в виду frontend разработку. Тема очень интересная, однако мои теоретические знания здесь довольно скромны и по большей части не систематизированы.
Тем не менее, если эта тема вам интересна, возникает логичный вопрос — с чего же начать изучение?
Одна из самых популярных задач, на которых можно попрактиковаться в изучении нового языка программирования — это написать на нем чат. Решив, что это хорошая идея я отправился бороздить просторы интернета в поисках того как это сделать правильно.
Давний друг c «большим именем» привел меня к статье в которой говорится об ABAP Channels. Если коротко, то ABAP Channel позволяет, например, через Web UI получить доступ к ABAP данным (backend) в режиме реального времени. И это только небольшая область их возможного применения. Замечательно!
В той же статье я нашел ссылку на пост ABAP Channels Examples, в котором говорилось, что SAP давно меня опередил и в качестве примера уже реализовал простой чат на основе технологий APC (ABAP Push Channels) и AMC (ABAP Message Channels). И вот как он выглядит:
Источник изображения: https://blogs.sap.com/2016/06/09/abap-channels-examples/
Что ж, раз чат уже реализован, мне стало любопытно узнать как он работает.
Итак, лига детективов, если вам тоже стало интересно — прошу, присоединяйтесь! Впереди вас ждет маленькое расследование, в котором мы постараемся узнать некоторые подробности о связи двух подозрительных личностей: Бэкенда и Фронтенда…
Часть первая, теоретическая
Для начала рассмотрим попавшую к нам в руки (из надежного источника) схему совместной работы двух пользователей, реализованную посредством APC и AMC:
Источник изображения: https://blogs.sap.com/2014/11/24/say-goodbye-to-polling-real-time-eventing-in-abap-with-abap-channels/
На схеме показано, что внутри ABAP системы пользователи могут обмениваться сообщениями посредством AMC. В то же время для обмена сообщениями между ABAP системой и браузером необходимо использовать APC, который является реализацией WebSocket в (протокол RFC 6455).
Теперь перейдем к практике и посмотрим, как это все реализовано.
Часть вторая, практическая
Начнем расследование с транзакции SICF «Ведение сервисов». Здесь нас интересует сервис ping, о котором говорилось в статье ABAP Channels Examples упомянутой выше.
Убедитесь, что сервис активирован и если нет, активируйте его с помощью контекстного меню.
Далее, в том же контекстном меню выберите «Тест сервиса».
После успешной авторизации (логин/пароль те же, что и в SAP GUI) вы увидите чат!
Немного поиграв с ним, попробовав открыть в разных вкладках браузера или, чего уж там, в разных браузерах, вспомните зачем вы здесь! Вы взрослый человек в конце концов!
Займемся серьезными вещами, и нажмем наконец F12.
Как думаете, где в системе хранится эта html страница? Сейчас мы это выясним!
Вернемся в транзакцию SICF. Дважды кликнем по сервису нашему сервису ping и перейдем на вкладку «Список поставщиков». Ага! Теперь одно мы знаем наверняка: кто-то что-то куда-то поставляет!
Перестаньте улыбаться! У нас тут серьезное дело.
Проваливаемся в обработчик.
Класс CL_HTTP_EXT_PING_PAGE является HTTP обработчиком. Он реализует интерфейс IF_HTTP_EXTENSION и содержит только один метод HANDLE_REQUEST( ).
В этом методе и содержится вся html-страница (да, в ABAP так тоже можно), которая отправляется Бекэндом (сервером) по просьбе Фронтенда (клиента).
Поставим здесь внешнюю точку останова, а сами тем временем отправимся на поиски места, где происходит прием сообщения от пользователя и его трансляция во все открытые окна чата.
Для этого в транзакции SE80 выберем раздел Connectivity Browser -> ABAP Push Channel -> PING.
В приложение PING указан класс CL_APC_WS_EXT_PING.
В классе, в методе IF_APC_WS_EXTENSION~ON_MESSAGE( ) мы видим последовательный вызов двух приватных методов: DESERIALIZE( ) и SERIALIZE( ).
Ну, теперь все стало на свои места.
Сообщение, которое было отправлено пользователем десериализуется из JSON во внутреннюю структуру, в ней дополнительно заполняется поле «author» и все это следом сериализуется обратно и отправляется получателям через APC.
Вот так реализован демо чат в SAP.
Если поставить в методе ON_MESSAGE( ) внешнюю(!) точку останова, и отправить любое сообщение, то вы и сами сможете все проверить.
На этом пожалуй все.
До встречи!🕵️♂
P.S.
Обратите внимание, что в статье мы опустили то, как работает отправка/прием сообщений в SAP GUI.
Если Вам интересно, то вот две программы:
RS_AMC_RECEIVE_MESSAGE
RS_AMC_SEND_MESSAGE
В них нет ничего сложного и я уверен вы легко сможете в этом разобраться.
P.P.S.
А еще среди тестовых примеров есть ping pong!