3.1.4. Запросы в формате JSON¶
Рассмотрим обработку запросов в формате JSON на основе базового примера. Для отправки запросов мы используем простые скрипты на языке Python. Для приёма и обработки запросов нам понадобится кластер TDG, настроенный ранее.
3.1.4.1. Адаптация конфигурации из базового примера¶
Поскольку базовый пример использует JSON, то адаптация конфигурации системы из базового примера не потребуется.
3.1.4.2. Описание процесса обработки запроса¶
Логика обработки поступающего запроса изложена в файле конфигурации системы
config.yml и состоит в следующем:
Согласно разделу
connector/inputфайла конфигурацииconfig.ymlHTTP (JSON) запросы передаются на обработку конвейеруrouter, который состоит из функцииrouter;Функция
routerссылается на файлrouter.lua, который упаковывает поступивший объект с ключомrouting_keyравным строкеinput_key;Согласно разделу
connector/routingфайла конфигурацииconfig.yml, все объекты с ключомinput_keyпередаютсяto_input_processor;В секции
outputдля разделаconnectorуказана единственная записьto_input_processor, которая переадресует запрос в разделinput_processorдля обработки на одноименной роли;В разделе
input_processorвсе запросы попадают в секциюclassifiers, где в нашем случае указан один единственный объект, вызывающий конвейер (pipeline)classifier;Конвейер
classifierвызывает одноименную функцию, которая описана в файлеclassificator.lua. Как можно понять из названия, данная функция занимается классификацией поступающей информации. Логика ее работы следующая:при наличии ненулевого поля
usernameу поступившего объекта — ему присваиваетсяrouting_key=add_user. Для объектов с таким ключом вconfig.ymlпредусмотрено сохранение (на ролиstorage) объекта с типомUserиз модели данных;при наличии ненулевого поля
book_nameу поступившего объекта — ему присваиваетсяrouting_key=add_book. Для объектов с таким ключом вconfig.ymlпредусмотрено сохранение (на ролиstorage) объекта с типомBookиз модели данных;при наличии ненулевых полей
user_idиbook_idу поступившего объекта — ему присваиваетсяrouting_key=add_subscription. Для объектов с таким ключом вconfig.ymlпредусмотрено сохранение (на ролиstorage) объекта с типомSubscriptionиз модели данных;во всех остальных случаях объекту присваивается
routing_key=unknown_type, то есть объект не распознан. Такой объект обычно попадает в ремонтную очередь, но можно настроить и иное поведение;
В секции
storageописано сохранение данных в TDG.при значении
routing_keyравномadd_userпоступивший объект преобразовывается в типUserпри сохранени;при значении
routing_keyравномadd_bookпоступивший объект преобразовывается в типBookпри сохранени;при значении
routing_keyравномadd_subscriptionпоступивший объект преобразовывается в типSubscriptionпри сохранении.
Обратите внимание, что вся лишняя информация, не относящаяся к типу объекта, описанному в модели данных, не будет сохранена.
Из всего файла конфигурации системы остался не рассмотренным участок, отвечающий
за сервисы. В данном примере там описан простой сервис, вызывающий функцию select_user_books
с аргументом user_id и возвращающий строковую переменную.
Логика работы этой функции такова: переданное значение user_id используется
для поиска в объекте Subscription всех книг, записанных за данным пользователем.
Затем выводятся все найденные book_id.
3.1.4.3. Подготовка запроса в формате JSON¶
Создайте файл request.py со скриптом на языке Python для отправки простейшего
запроса с полями объекта типа User (из нашей модели данных:
это поля id и username), который будет выглядеть следующим образом:
import requests
data = {'username' : 'John Smith', 'id' : 1}
header = {'Authorization' : 'Bearer ee7fbd80-a9ac-4dcf-8e43-7c98a969c34c'}
r = requests.post(url = "http://172.19.0.2:8080/http", json = data, headers = header)
Примечание
Используйте в качестве значения для параметра Authorization: Bearer токен приложений,
сгенерированный ранее.
Для успешного добавления записи имеющегося в модели данных типа объекта в запросе должны содержаться все обязательные поля для данного типа объекта.
Процедура отправки запроса и ожидаемые результаты описаны ранее в пункте Отправка запросов.