Как реализовать фильтрацию в REST API - PullRequest
1 голос
/ 10 июня 2019

Я создаю успокоительный API, используя Spring MVC и Spring JPA для подключения к базе данных.У меня есть требование создать API-интерфейс get, который может фильтровать результаты на основе filterString (переданного в качестве параметра запроса в запрос GET).

Пример API-интерфейса GET для объектов сотрудников фильтра:

http://localhost:8080/api/v1/employee?filter="(firstName eq john) and (lastName eq doe) or (empId eq 123)"

В настоящее времяЯ добиваюсь этого путем анализа filterString с помощью regX и создания из него объекта «Spring jpa Specification»

Ниже приведен фрагмент кода

public List<Employee> searchEmployee(String filter) throws Exception {
        // filter = "/"(firstName eq john) and (lastName eq doe) or (empId eq 123)/""
        // remove the " characters from start and end
        filter = filter.replaceAll("^\"|\"$", "");

        // spit the string basis of and/or
        String[] value = filter.split("(((?<=or)|(?=or)))|(((?<=and)|(?=and)))");
        Specification specs = null;
        String op = null;
        for (String f : value) {
            if (!"or".equalsIgnoreCase(f) && !"and".equalsIgnoreCase(f)) {
                String[] p = f.trim().split("\\s{1,}");
                if (p != null && p.length == 3) {
                    EmployeeSpecification es = new EmployeeSpecification(new SearchCriteria(p[0], p[1], p[2]));
                    if (specs == null ) {
                        specs = Specification.where(es);
                    } else {
                        if ("or".equalsIgnoreCase(op)) {
                            specs = specs.or(es);
                        } else if ("or".equalsIgnoreCase(op)) {
                            specs = specs.and(es);
                        }
                    }

                } else {
                    throw new Exception("Invalid search criteria");
                }

            } else {
                op = f;
            }


           List<Employee> l = empDao.findAll(specs);

          return l;

        }

Я видел много REST API, которые поддерживаютфильтрация, как это.Кто-нибудь может подсказать, как лучше всего реализовать фильтрацию на стороне сервера RESt?

1 Ответ

0 голосов
/ 11 июня 2019

Я использую rsql-parser в своих проектах.Я анализирую строку запроса, создавая критерий объекта или SQL-запрос.

...