REST GET API с дополнительными параметрами - разработка и реализация - PullRequest
1 голос
/ 16 апреля 2019

время подумать о том, как написать аккуратный код, ах! У меня была конечная точка REST в моей виртуальной библиотеке, чтобы перечислить все книги, которые у нас есть:

@GetMapping(path = "/books")
public List<Book> getBooks() {
    return bookService.findAllBooks();
}

Они сказали: «Привет, javanewbie! Иногда мы хотим отфильтровать этот список по автору книги при запросе из пользовательского интерфейса». Я сказал: «Хорошо», теперь это:

  @GetMapping(path = "/books")
  public List<Book> getBooks(
      @RequestParam(value = "author", required = false) String author) {
    if (isEmpty(author)) {
      return bookService.findAllBooks();
    } else {
      return bookService.findBooksByAuthor(bookName);
    }
  }

Теперь они говорят: "эй, теперь мы хотим иметь возможность фильтровать все книги иногда по годам" Поэтому я подумал ... Эмм, это станет как:

  @GetMapping(path = "/books")
  public List<Book> getBooks(
      @RequestParam(value = "author", required = false) String author,
      @RequestParam(value = "year", required = false) String year) {
    if (isNotEmpty(author)) {
      return bookService.findBooksByAuthor(author);
    } else if (isNotEmpty(year)) {
      return bookService.findBooksByYear(year);
    } else {
      return bookService.findAllBooks();
    }
  }

если позже они попросят больше необязательных параметров - я должен разделить этот API на отдельные конечные точки или придумать какой-нибудь сложный и интеллектуальный поиск? Как бы вы пошли сюда?

1 Ответ

0 голосов
/ 16 июля 2019

Для тех, кто заинтересовался - я решил не делать это слишком круто, как решения для Java-конференций.Таким образом, решение было:

  1. принять параметры как значения @RequestParam в одной конечной точке
  2. построить карту этих параметров (чтобы они были похожи на json)
  3. создать поисковый запрос, представляющий сущность с частичными параметрами, заполненными
  4. use org.springframework.data.domain.Example например,

    Example<Book> bookExample = Example.of(probe, ExampleMatcher.matchingAll())

  5. используйте org.springframework.data.repository.query.QueryByExampleExecutor#findAll(org.springframework.data.domain.Example<S>) например bookRepository.findAll(bookExample)

, чтобы найти только те объекты, которые соответствуют входящим параметрам

BINGO.

...