Java REST获取带可选参数的API-设计和实现

Java REST获取带可选参数的API-设计和实现,java,api,rest,get,Java,Api,Rest,Get,在我的虚拟图书馆中有一个REST端点,列出我们在那里拥有的所有书籍: @GetMapping(path = "/books") public List<Book> getBooks() { return bookService.findAllBooks(); } @GetMapping(path=“/books”) 公共列表getBooks(){ return bookService.findAllBooks(); } 他们说:“有时候我们想在从用户界

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

@GetMapping(path = "/books")
public List<Book> getBooks() {
    return bookService.findAllBooks();
}
@GetMapping(path=“/books”)
公共列表getBooks(){
return bookService.findAllBooks();
}
他们说:“有时候我们想在从用户界面请求时按图书作者筛选该列表”

现在是:

  @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”)
公共列表getBooks(
@RequestParam(value=“author”,required=false)字符串(author){
如果(我是空的(作者)){
return bookService.findAllBooks();
}否则{
return bookService.findBooksByAuthor(书名);
}
}
现在他们说:“现在我们希望能够过滤所有的书籍,有时也要按年度过滤”

所以我想。。。会不会变成:

  @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();
    }
  }
@GetMapping(path=“/books”)
公共列表getBooks(
@RequestParam(value=“author”,required=false)字符串author,
@RequestParam(value=“year”,required=false)字符串年份){
if(isNotEmpty(author)){
return bookService.findBooksByAuthor(author);
}否则,如果(isNotEmpty(年)){
return bookService.findBooksByYear(年);
}否则{
return bookService.findAllBooks();
}
}
如果以后他们要求更多可选参数,我是应该将此API拆分为单独的端点,还是发明一些复杂而智能的搜索?
你会怎么做?

对于那些感兴趣的人,我决定不把它做得像java会议的解决方案一样酷。 因此,解决办法是:

  • 在一个端点中接受参数作为@RequestParam值

  • 构建这些参数的映射(使它们类似于json)

  • 创建表示具有部分参数的实体的搜索“探测” 人口

  • 使用org.springframework.data.domain.Example,例如

    Example bookExample=Example.of(probe,ExampleMatcher.matchingAll())

  • 使用
    org.springframework.data.repository.query.QueryByExampleExecutor#findAll(org.springframework.data.domain.Example)
    例如
    bookRepository.findAll(bookExample)

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


    答对了。

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

  • 在一个端点中接受参数作为@RequestParam值

  • 构建这些参数的映射(使它们类似于json)

  • 创建表示具有部分参数的实体的搜索“探测” 人口

  • 使用org.springframework.data.domain.Example,例如

    Example bookExample=Example.of(probe,ExampleMatcher.matchingAll())

  • 使用
    org.springframework.data.repository.query.QueryByExampleExecutor#findAll(org.springframework.data.domain.Example)
    例如
    bookRepository.findAll(bookExample)

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


    答对了。

    查看此网站:它为您面临的确切问题提供了一个很好的教程x@BankBuilder查看此网站:它为您面临的确切问题提供了一个很好的教程x@BankBuilder