首页 > 解决方案 > 带有可选参数的 REST GET API - 设计和实现

问题描述

在我的虚拟图书馆中有一个 REST 端点来列出我们在那里拥有的所有书籍:

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

他们说:“有时我们希望在向 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 拆分到单独的端点还是发明一些复杂和智能的搜索?你会怎么去这里?

标签: javaapirestget

解决方案


对于那些感兴趣的人——我决定不让它像 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)

仅查找与传入参数匹配的实体

答对了。


推荐阅读