繁体   English   中英

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

[英]REST GET API with optional parameters - design and implementation

在我的虚拟图书馆中有一个 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 拆分到单独的端点还是发明一些复杂和智能的搜索? 你怎么会去这里?

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

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

答对了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM