Додавання генерації POST-методів для пошуку даних
🌐 Цей документ доступний українською та англійською мовами. Використовуйте перемикач у правому верхньому куті, щоб змінити версію. |
1. Загальний опис
При поточній реалізації з виконанням GET-запитів для пошуку даних, виникли проблеми з пошуком по типу IN/NOT_IN.
Вони пов’язані з неможливістю коректно обробити випадок, коли приходить запит типу GET /search?inParam=value1,value2 , де параметр inParam є єдиним значенням value1,value2, а не масивом значень ["value1", "value2"]. Подібні структури в запиті Spring Web фреймворк парсить саме як масив [value1, value2].
В якості воркераунду можливим виявилось формувати запит у форматі GET /search?inParam=value1,value2&inParam=. В такому випадку Spring формує параметри у масив ["value1,value2", ""], що є коректним для пошуку за типом IN/NOT_IN.
Проте використання подібного воркераунду є можливим тільки для випадків, де клієнт може явно сконфігурувати запит HTTP-запит з необхідними пошуковими параметрами у правильному форматі.
Такими сценаріями є:
-
Інтеграція через UI-форми
Проте для сценаріїв, де запити пошуку даних формуються програмно всередині мікросервісів системи, таких як:
-
виставлення ендпоінтів пошуку даних через Трембіту (через soap-api)
-
використання ендпоінтів пошуку даних через делегати у бізнес-процесах (через bpms)
наявний воркераунд використати неможливо або це створить суттєві проблеми для розробки та підтримки такого рішення, що в майбутньому може призвести до блокуючих проблем у команд розробки.
Як вирішення таких проблем було вирішено додатково до генерації GET-інтерфейсу для пошуку даних також генерувати і POST-інтерфейс, при використанні якого необхідні пошукові параметри будуть формуватись у тілі запиту формату JSON, який дозволяє коректно відрізняти окремі одиночні значення від масивів.
2. Загальні принципи та положення
-
GET і POST ендпоінти мають генеруватись разом
-
Для внутрішніх інтеграцій всередині системи перейти на використання POST
-
Використання GET методів залишається для зворотньої сумісності при використанні клієнтами сценаріїв Пошук з UI-форм, Публічний API та Інтеграція з зовнішніми системами
-
Використання POST-методів для сценаріїв Публічний API та Інтеграція з зовнішніми системами стане можливим
-
Використання POST-запитів для пошуку даних не впливає на сценарії модифікації даних, де також використовується метод POST (залишаються актуальними усі Network Policy, а також перевірка HTTP-заголовків при збереженні даних)
-
Перехід UI-форм на використання POST методу наразі не потребується та є поза скоупом
3. Високорівневий план розробки
3.1. Приклад
Для критерію пошуку
<changeSet author="registry owner" id="create SC registration_equal_laboratory_id_solution">
<ext:createSearchCondition name="some_sc">
<ext:table name="some_table" alias="r">
<ext:column name="some_id" />
<ext:column name="some_equal_column" searchType="equal"/>
<ext:column name="some_in_column" searchType="in"/>
</ext:table>
</ext:createSearchCondition>
</changeSet>
разом з існуючим GET-ендпоінтом повинен згенеруватись POST
Новий API
3.3. План розробки
Компонент |
Необхідне розширення |
Мета |
service-generation-utility |
додати генерацію POST ендпоінтів пошуку даних |
виклик нових ендпоінтів з soap-api та bpms |
service-generation-utility |
змінити генерацію коду soap-api на відправку запитів до rest-api, перейти на POST |
уникнути проблем з виставленням SC з пошуком через IN/NOT_IN через Трембіту |
service-generation-utility |
змінити AuthPolicy для зовнішніх інтеграцій з rest-api-ext, дозволити обробку POST для ендпоінтів пошуку даних (не має впливати на ендпоінти модифікації даних) |
можливість викликати POST ендпоінт для сценарію Пошук даних без Трембіта |
rest-api-core-base-image |
для пошукових POST запитів прибрати валідацію специфічних заголовків (X-Digital-Signature, X-Source-Business-Process etc.) |
у поточній реалізації валідація заголовків налаштована за HTTP-методом, а не за викликаним ендпоінтом, внаслідок чого всі POST-запити валідуються. З новим підходом цю логіку необхідно змінити |
bpms |
змінити делегати пошуку (DataFactoryConnectorSearchDelegate, RegistryDataFactoryConnectorSearchDelegate), додавши можливість приймати як параметр пошуку Map<String, Object> (зараз - Map<String, String>) |
для коректного пошуку за типом IN у POST запиті необхідно буде передати список допустимих значень, вони відправляться з bpms як string ключ - list значення. Не має виникнути проблем зі зворотньою сумісністю, оскільки Map<String, Object> є ширшим, ніж поточне Map<String, String> |
ddm-data-factory-client |
оновити Feign-клієнти, які використовуються делегатами, на POST метод |
використання в bpms клієнту |
platform-gateway |
додати обробку POST-запитів пошуку замість GET |
оскільки сценарій пошуку без Трембіти перемикається на POST метод, у проксі-сервісі platform-gateway теж необхідно перемкнутись на обробку запитів саме цього методу |
Також важливим є документування функціональності:
-
Задокументувати особливості використання GET-методів при пошуку з IN/NOT_IN
-
Задокументувати рекомендації щодо формування тіла POST запиту (особливо при пошуку IN/NOT_IN)