Если это не GraphQL api, у которого любой запрос это POST, то общепринято для получения информации использовать GET запрос. Так же это сделано для того, чтобы вы могли поделиться этой ссылкой с другим человеком и еще чтобы правильно работало SEO.
Выглядеть это должно примерно вот так.
1. Для начала разберемся с pagination, тут есть два пути:
А. Передавать два параметра, limit - кол-во записей, offset - отступ
Первая страница /producst?limit=20&offset=0
Вторая страница /producst?limit=20&offset=20
B. Передавать только page, и уже на backend'е высчитывать limit и offset для обращения в БД
Первая страница /producst
Вторая страница /producst?page=2
// Тут мы для первой страницы можем забить и не передавать никакие значения,
// так как на backend'е предусматриваем page = 1 по дефолту.
2. Значения фильтров так же передаем параметрами
/producst?page=2&categoryIds=15,7,23
3. И затем на backend'е уже парсим наши фильтры, незабывая предусмотреть дефолтные значения для фильтров. Есть разные подходы, первое что пришло в голову, это следующее решение
let filter = {
// тут можно предусмотреть некоторые значения фильтра по дефолту
isAvailableOnStock: true,
}
// И затем парсим каждое значение
if (query.categoryIds) {
// В зависимости от базы данных, а так же драйвера и ORM,
// которые мы используем, будет отличаться
// делайте это в соответсвии с документацией
filter.category_id = In(query.categoryIds.split(','))
}
// Делаем запрос в нашу базу
// Для примера используется TypeORM
const products = await getRepository(Products).find({
// Используем наш объект filter
where: {
...filter,
},
// Сортируем результат по названию
order: {
title: 'ASC',
}
})
P. S. Еще помните, что существует сортировка, по цене, по имени, и прочее, которую так же необходимо передавать через параметр и затем сортировать результат из базы данных через "ORDER BY"