2016-10-12 3 views
0

У меня есть служба REST/учетные записи, которая возвращает все данные учетных записей (Number, Name).Spring MVC REST API для фильтрации/поиска из коллекции

Требование: следует поддерживать ниже шаблон поиска/фильтр с любой комбинацией «И» или «ИЛИ», а не retruning всей коллекции.

  • StartsWith
  • EndsWith
  • Содержит

Вопрос 1: Являются ли они ниже дизайн API правильно (RESTful) или какой-либо лучшего способа сделать то же самое например -

/accounts?name^My Account 123**or**number~ACC1234 

(^ "==> Начинается с," ~ "==> заканчивается)

/accounts?name^My Account 123**and**number~ACC1234 

(^ "==> начинается с "~" ==> заканчивается)

/accounts?name$ACC123 

($ ==> Коллекция счет содержит ACC123)

Spring Controller:

Планирование получения этого шаблона фильтра (параметра запроса) как @RequestParam и регулярное выражение для анализа шаблона, а затем применить &, чтобы получить его из хранилища данных. Недостатком является любой новый шаблон фильтра, который потребует изменения в классе Controller.

Вопрос 2: Есть ли какие-либо функции, доступные в Spring 3 для поиска/фильтрации из коллекции?

Спасибо!

+2

Почему бы не использовать apache solr, который доступен как модуль весной, как весовые данные solr для справки http://docs.spring.io/spring-data/solr/docs/2.0.4.RELEASE/reference/html/ –

+0

Есть ли причина, по которой вы не используете параметры запроса? –

ответ

1

С точки зрения дизайна, используя параметры запроса, чтобы указать параметры поиска/фильтра, это хорошо. Однако для более сложных случаев, таких как ваш, я обычно определяю новую конечную точку, которая касается только запросов.

В качестве примера, если моя логика для поиска строго «или» и «содержит», я бы определил поиск книги как таковой:

GET /books/?author=john&keywords=how%20to%20use%20spring 

Здесь мой API строго собирается искать книги где имя автора содержит «john», и в содержании появляются слова «как использовать весну». Логика поиска остается последовательной, и клиент не имеет гибкости.

В вашем случае, если клиент имеет возможность конкретных своих собственных критериев поиска, вам нужно построить новую конечную точку, что-то вроде:

POST /books/search 

И в теле запроса, размещать свои собственные критерии поиска DSL как name^My Account 123**and**number~ACC1234

Смежные вопросы