Фильтрация в REST API

0

В настоящее время мы строим API RESTful. Теперь, это вопрос того, что лучший способ борьбы с фильтрацией.

У нас есть /products. /products возвращает все данные, к которым у вас есть доступ. Теперь скажем, вы хотите, чтобы продукты, в которых description точно соответствует "Без описания". Вы получите /products?description=No+description.

Теперь, в идеале, у нас будет больше параметров фильтра. Показывать только товары, где запас больше или равен 1, но меньше 10. Показывать только товары, где имя заканчивается black или начинается с white. Какова наилучшая практика? Будем ли мы использовать логические операторы в URL-адресе, как нам избежать диких карт?

Текущее состояние дел:

/products?product_name=%25black найдет все продукты с именами, заканчивающимися на черном.

или

/products?product_name=white%25 найдет все продукты с именами, начинающимися с белого.

% 25 - это закодированная форма %. Все идет нормально.

Но что, если кто-то хочет найти продукт, где имя соответствует буквенному символу %? Или хочет найти продукты с запасом? Было бы лучше представить

min_stock и max_stock, или возможно (или мы даже хотим?) использовать логические операторы (?stock=>=1&stock=<=5). Существует ли стандарт для обработки URL-адресов или подобных ситуаций?

Мы слишком задумываемся? Является ли это возможным? Должны ли мы не фильтровать наш конец, но позволить пользователям самим понять это?

Теги:
rest

1 ответ

1
Лучший ответ

Парадигма REST - это ресурсы ressources (все, к чему вы обращаетесь, это ressource) и понятность человека. Вот почему вы делаете свой URL-адрес множественного числа.

С учетом сказанного, я думаю, если вы хотите, чтобы фильтровать двумя различными способами (с =, like, регулярное выражение...) у вас есть два possibilitiees:

  • сначала создайте три разных фильтра product_name_exact, product_name_like, product_name_regex. Это похоже на python.django способ фильтрации, и он довольно изящный;
  • второй способ: создать одно поле query, а затем query_mode это то, как работает bing api.
  • 0
    Хорошо, мне нравится идея иметь _exact и _like, но как это будет работать? Если я хочу найти товар с названиями, начинающимися с белого или заканчивающимися черным? product_name_like=black ?
  • 0
    вы можете использовать _end, _start, _contain вместо _like, но вы также можете попытаться использовать urlencoded char для \` before any %`.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню