java - 带有可选参数的 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 拆分到单独的端点还是发明一些复杂和智能的搜索?你会怎么去这里?
解决方案
对于那些感兴趣的人——我决定不让它像 Java 会议的解决方案那样太酷。所以解决方案是:
在一个端点接受参数作为@RequestParam 值
构建这些参数的映射(使它们类似于 json)
创建搜索“探针”表示填充了部分参数的实体
使用 org.springframework.data.domain.Example 例如
Example<Book> bookExample = Example.of(probe, ExampleMatcher.matchingAll())
使用
org.springframework.data.repository.query.QueryByExampleExecutor#findAll(org.springframework.data.domain.Example<S>)
例如bookRepository.findAll(bookExample)
仅查找与传入参数匹配的实体
答对了。
推荐阅读
- r - 拆分数据框中列的字符以在 R 中的值之间插入下划线
- r - 如果 xts 对象在某个时间范围内,则从它们中删除行
- r - 将结果保存在 R 中的循环中
- javascript - 在移动版 Chrome 中始终隐藏或始终显示滚动条
- java - java.lang.ClassNotFoundException:org.apache.jasper.servlet.JspServlet
- typescript - 为什么 type-graphql 不能从类的属性中推断出字符串类型?
- python - 我连接和显示 ftp 服务器内容的代码不会 cwd 超出 /[dir]/
- c++ - std::function 内部存储器组织和副本;传递参考与价值
- python - 熊猫上的 read_excel 或 read_csv
- python - 不使用 f 语句连接混合类型变量的正确方法