@uhamurad

Как объединить списки, полученные от 2 REST API с параметрами `limit` и `offset`, и вернуть его, согласно параметрам `limit` и `offset`?

Коротко

Как объединить списки, полученные от двух REST API с параметрами `limit` и `offset`, и вернуть объединенный список в результате вызова 3-го REST API также с параметрами `limit` и `offset`?

Подробно

Есть эндпоинты 2 REST API:

GET api-1/events? limit=10 & offset=20
GET api-2/events? limit=10 & offset=20


Которые возвращают упорядоченные по дате списки, например:

api-1:
[
    { "date": "2024-02-11", "text": "magna aliqua" },    
    { "date": "2024-02-10", "text": "enim ad minim" },
    ...    
    { "date": "2024-02-01", "text": "quis nostrud" }  
]

api-2:
[
    { "date": "2024-02-11", "text": "exercitation ullamco" },    
    { "date": "2024-01-11", "text": "laboris nisi" },
    ...    
    { "date": "2023-04-11", "text": "aliquip ex" }  
]


Нужно написать эндпоинт для 3-го REST API:

GET api-3/events? limit=10 & offset=20

Который возвращает упорядоченный по дате список - объединиение результатов вызовов "GET api-1/events" и "GET api-2/events".

Проблема имеет простое решение для первой страницы (когда `offset=0`), но для последующих страниц приходится делать много запросов к `api-1` и `api-2`.

Вопросы

1. Есть ли у проблемы общеизвестное название? Я бы погуглил его, чтобы приблизится к правильному решению.
2. Как разработать `api-3`, чтобы он работал достаточно оптимально:
- оставалась возможность отправлять запросы API к `api-1` и `api-2` параллельно

У меня есть доступ и возможность изменить порядок работы `api-1`, `api-2` и `api-3`. Например, я склоняюсь к тому, чтобы заменить параметры "order" и "offset" параметрами "dateFrom" и "dateTo". Это решит проблему слияния, но появятся другие проблемы - уже на стороне клиента API, чего не хотелось бы.
  • Вопрос задан
  • 128 просмотров
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Разобраться в коде двух уже существующих методов и написать третий, работающий самостоятельно, без обращения к двум первым.
Ответ написан
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Согласен с Rsa97, лучше всего написать новый метод без обращения к этим АПИ, а напрямую работающий с их источниками.

Но, если вам надо обязательно вот так извращатся, то это практически задача с leetcode: https://leetcode.com/problems/median-of-two-sorted...

Почитайте решения, погулите - есть куча видео с понятным разбором. Суть в бинарном поиске.

У вас же тут надо не медиану найти, а k-ый элемент.
У вас тут фактически дано 2 массива API1 и API2. Чтобы прочитать один (или несколько) элементов вам надо сделать запрос к АПИ.

Вам надо найти offset-ый, offset+1 и т.д элементы в объедененном массиве.
Для начала просто найдите offset-ый элемент. Зная его позиции в обоих массивах сделайте 2 запроса с этих
позиций и данным limit. Потом как в задаче о слиянии двух массивов выведите первые limit.

Во время бинпоиска делайте запросы с limit=1, а offset = индекс в массиве.

Update:
Забыл написать, тут у вас будет что-то около 2*log(offer+limit) запросов с limit=1 к разным апи, и потом еще 2 запроса с limit=limit из общего запроса.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы