[英]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 会议的解决方案那样太酷。 所以解决方案是:
在一个端点接受参数作为@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)
仅查找与传入参数匹配的那些实体
答对了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.