Я использую конcтруктор запросов, вот накидал простенький пример:
class Get {
constructor(entity) {
this.entity = entity;
this.query = []
}
addFilter(field, type, val) {
this.query.push(`filter=${field}||${type}||${val}`)
return this
}
addOrder(field, direction) {
this.query.push(`order=${field}||${direction}`)
return this
}
async send() {
const queryString = this.query.length ? '?params|' + this.query.join('&') : '';
return await console.log(this.entity + queryString)
// вместо console.log к примеру axios
}
}
const books = new Get('books').send()
// books
const audio = new Get('audio').addFilter('id', 'eq', 1).send()
//audio?params|filter=id||eq||1
const images = new Get('images').addFilter('name', 'like', 'cat').addOrder('createdAt', 'DESC').send()
// "images?params|filter=name||like||cat&order=createdAt||DESC"
На бэкенде используется парсер, который определяет, что от него хочет получить фронт. Все управление запросом ложится на параметры и методы. Плюс в том, что не нужно создавать кучу сервисов на каждый роут api. Появляется некоторый структурный подход к работе с апи на фронте и бэкенде ускоряет работу над большими проектами.