Я пытаюсь создать веб-API, который будет обрабатывать данные, предоставленные сервером USSD от оператора мобильной сети (MNO). Ниже приведен фрагмент того, как этот вид взаимодействия работает с внешней системой, являющейся моим приложением.
Для каждого запроса я должен определить, на каком уровне находится пользователь, и ответить соответствующим меню. Оператор мобильной связи отправит мне что-то вроде http://my_app_url?*123*#
. Поскольку между последним * и # ничего нет, я определяю, что это запрос корневого меню, и я могу ответить пользователю меню, например. 1. Зарегистрируйтесь, 2. Проверьте баланс, 3. Запросите PIN-код. Предполагая, что пользователь хочет проверить баланс, он выберет Меню 2 на своем мобильном телефоне, и оператор мобильной связи отправит мне http://my_app_url?*123*2#
. Я отвечаю: 1. Введите номер счета, 2. Запросите обратный звонок. Пользователь решает ввести номер счета, и оператор мобильной связи отправит http://my_app_url?*123*2*1#
, который сообщит мне, где находится пользователь.
Хотя все меню не длинное, его можно запутать, поскольку у меня может быть следующая комбинация. http://my_app_url?*123*1*2*3*1#
или http://my_app_url?*123*1*1*3#
или http://my_app_url?*123*2*1*3*1#
и т.д.
Еще немного информации:
Каждый запрос, отправляемый оператором мобильной связи, содержит номер мобильного телефона пользователя, идентификатор сеанса USSD, созданный оператором мобильной связи, который будет оставаться до завершения сеанса USSD, и параметры USSD, т. е. от первого * до # в приведенных выше примерах.
Я сохранил меню для приложения USSD в базе данных (sql fiddle), поэтому в зависимости на уровне, на котором находится пользователь, я могу знать, какое меню ему обслуживать, например если его корневой запрос, я могу предоставить пользователю все меню, родительское_меню которых равно 1. Если это запрос проверки баланса, я отвечу всеми меню, родительское меню которых равно 2 и т. д. и т. д.
Мой текущий подход к определению того, какой запрос делает пользователь, состоит в том, чтобы написать несколько операторов if else, но посередине я теряю след и это усложняется. В глубине души я чувствую, что должен быть более элегантный способ анализировать запросы, отправленные пользователем, и определять, на каком уровне находится запрос, и знать, что их обслуживать. Можете ли вы предложить лучший подход? А еще лучше, есть ли у вас опыт создания такого типа приложений, и не могли бы вы поделиться своей логикой перемещения по меню?