Предисловие

Доброго времени суток, друзья!

Недавно, задумавшись на тему дальнейшего саморазвития, поймал себя на мысли, что быть backend-разработчиком конечно замечательно, и мне это нравится, но вместе с тем остается ощущение, что ты многое упускаешь. Как вы уже наверное поняли, я имею в виду frontend разработку. Тема очень интересная, однако мои теоретические знания здесь довольно скромны и по большей части не систематизированы.

Тем не менее, если эта тема вам интересна, возникает логичный вопрос — с чего же начать изучение?

Одна из самых популярных задач, на которых можно попрактиковаться в изучении нового языка программирования — это написать на нем чат. Решив, что это хорошая идея я отправился бороздить просторы интернета в поисках того как это сделать правильно.

Давний друг c «большим именем» привел меня к статье в которой говорится об ABAP Channels. Если коротко, то ABAP Channel позволяет, например, через Web UI получить доступ к ABAP данным (backend) в режиме реального времени. И это только небольшая область их возможного применения. Замечательно!

В той же статье я нашел ссылку на пост ABAP Channels Examples, в котором говорилось, что SAP давно меня опередил и в качестве примера уже реализовал простой чат на основе технологий APC (ABAP Push Channels) и AMC (ABAP Message Channels). И вот как он выглядит:

1

Источник изображения: https://blogs.sap.com/2016/06/09/abap-channels-examples/

Что ж, раз чат уже реализован, мне стало любопытно узнать как он работает.

Итак, лига детективов, если вам тоже стало интересно — прошу, присоединяйтесь! Впереди вас ждет маленькое расследование, в котором мы постараемся узнать некоторые подробности о связи двух подозрительных личностей: Бэкенда и Фронтенда…

Часть первая, теоретическая

Для начала рассмотрим попавшую к нам в руки (из надежного источника) схему совместной работы двух пользователей, реализованную посредством APC и AMC:

Рис 2

Источник изображения: 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 упомянутой выше.

Рис 3

Убедитесь, что сервис активирован и если нет, активируйте его с помощью контекстного меню.

Далее, в том же контекстном меню выберите «Тест сервиса».

Рис 4

После успешной авторизации (логин/пароль те же, что и в SAP GUI) вы увидите чат!

Рис 6

Немного поиграв с ним, попробовав открыть в разных вкладках браузера или, чего уж там, в разных браузерах, вспомните зачем вы здесь! Вы взрослый человек в конце концов!

Займемся серьезными вещами, и нажмем наконец F12.

Рис 7

Как думаете, где в системе хранится эта html страница? Сейчас мы это выясним!

Вернемся в транзакцию SICF. Дважды кликнем по сервису нашему сервису ping и перейдем на вкладку «Список поставщиков». Ага! Теперь одно мы знаем наверняка: кто-то что-то куда-то поставляет!

Рис 8

Перестаньте улыбаться! У нас тут серьезное дело.

Проваливаемся в обработчик.

Класс CL_HTTP_EXT_PING_PAGE является HTTP обработчиком. Он реализует интерфейс IF_HTTP_EXTENSION и содержит только один метод HANDLE_REQUEST( ).

Рис 9

В этом методе и содержится вся html-страница (да, в ABAP так тоже можно), которая отправляется Бекэндом (сервером) по просьбе Фронтенда (клиента).

Рис 10

Поставим здесь внешнюю точку останова, а сами тем временем отправимся на поиски места, где происходит прием сообщения от пользователя и его трансляция во все открытые окна чата.

Для этого в транзакции SE80 выберем раздел Connectivity Browser -> ABAP Push Channel -> PING.

В приложение PING указан класс CL_APC_WS_EXT_PING.

Рис 11

В классе, в методе IF_APC_WS_EXTENSION~ON_MESSAGE( ) мы видим последовательный вызов двух приватных методов: DESERIALIZE( ) и SERIALIZE( ).

Ну, теперь все стало на свои места.

Сообщение, которое было отправлено пользователем десериализуется из JSON во внутреннюю структуру, в ней дополнительно заполняется поле «author» и все это следом сериализуется обратно и отправляется получателям через APC.

рис 12

Вот так реализован демо чат в SAP.

Если поставить в методе ON_MESSAGE( ) внешнюю(!) точку останова, и отправить любое сообщение, то вы и сами сможете все проверить.

На этом пожалуй все.

До встречи!🕵️‍♂

P.S.

Обратите внимание, что в статье мы опустили то, как работает отправка/прием сообщений в SAP GUI.

Если Вам интересно, то вот две программы:

RS_AMC_RECEIVE_MESSAGE
RS_AMC_SEND_MESSAGE

В них нет ничего сложного и я уверен вы легко сможете в этом разобраться.

P.P.S.

А еще среди тестовых примеров есть ping pong!

Рис 13

Рис 14