带有可选参数的REST GET API-设计和实现

时间:2019-04-16 16:18:11

标签: java rest api get code-design

是时候简要考虑如何编写简洁的代码了! 我的虚拟图书馆中有一个REST端点,可以列出我们在那里拥有的所有图书:

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

他们说:“嘿,javanewbie!有时候我们想在从UI请求时按图书作者过滤该列表” 我说:“好”,现在是:

  @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 :(得分:0)

对于那些感兴趣的人-我决定不像Java会议的解决方案那样让它太酷。 因此解决方案是:

  1. 在一个端点上将参数接受为@RequestParam值
  2. 构建这些参数的映射(以使其类似于json)
  3. 创建表示带有部分参数的实体的搜索“探针” 填充
  4. 使用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。