我有一个关于URI的问题应该代表我的RESTful应用程序。 我已经阅读了很多关于不同资源的主题,但我仍然不确定如何实现以下情况:
我的控制器中有3个方法:
List<Books> getAllBooks()
List<Books> getBooksByTitle(String title)
List<Books> getBooksByAuthor(String author)
很明显,我应该为第一种方法选择"/books"
URI,但如果我为下一种方法映射"/books/title?"
或"/books/author?"
,则会出现异常&#34;模糊映射&# 34;被扔了。 "/books/title/"
和"/books/author/"
似乎不是一个好选择。
我可以向我建议什么样的解决方案?
答案 0 :(得分:4)
factored[2:3] <- lapply(factored[2:3], factor, levels = c("Yes", "No" , "Missing"))
- 获取所有图书GET /book
- 获取一本具有特定GET /book/{id}
id
- 获取给定GET /book?title={title}&author={author}
和title
我预测,你可以有更多的搜索选项,所以我更喜欢它的另一个端点:
author
BODY:{&#34;作者&#34;:&#34; aaa&#34;,&#34;标题&#34;:&#34; bbb&#34;} - 根据给定的搜索请求获取所有图书(我们在此处使用正文,因此我们无法在此使用POST /book/search
,因为GET
请求可以由任何人兑现活跃期内网络的一部分)。 注意: 在我看来,GET
或title
不是域对象,因此我不使用像{{1}这样的端点}或author
。 但是我不介意为一本书使用端点,例如:
GET /book/author/{author}
- 获取给定书籍的所有作者GET /book/title/{title}
- 获取给定图书的标题我希望我已经回答了你的问题。
答案 1 :(得分:1)
要成为RESTful,您应该使用搜索模式:
List<Books> getAllBooks() --> /books
List<Books> getBooksByTitle(String title) --> /books?title=...
List<Books> getBooksByAuthor(String author) --> /books?author=...
因为作者和头衔不是您图书的子资源。
如果您使用其唯一代码搜索图书,则应使用/books/{id}
,因为您正在识别特定资源。
这种模式允许您在需要时识别子资源,例如,如果您想要特定书籍的类型:
List<BookGenres> getGenresFromBook(int idBook) --> /books/{id}/genres
答案 2 :(得分:0)
如果您指的是Richardson成熟度模型,则应将您的终端视为资源。 这意味着您可以考虑使用带有查询参数的一个资源来过滤结果:
另一种方法可能是考虑“标题”资源和“作者”资源,这些资源将提供书籍实体的链接
答案 3 :(得分:0)
如果你使用的是Spring,你可以在这些方面找到一些东西
@RestController
@RequestMapping("/api/books")
public class BookController{
private BookService bookService;
public BookController(BookService bookService){
this.bookService=bookService;
}
@GetMapping()
public List<Book> getBooks(@RequestParam Map<String,String> allRequestParams){
return bookService.getBooks(allRequestParams);
}
}
然后你可以调用api:
本地主机:8080 / API /书籍的作者= AUTHORNAME
本地主机:8080 / API /书籍标题= BOOKTITLE
您可以从地图访问过滤器,例如allRequestParams.get(“title”);
您还可以实施过滤器实体,以确保正确设置过滤器,例如:
public class BookFilter{
private String title;
private String authorFilter;
// Getters and setters omitted
}
// And then in the Controller you can use the following
@GetMapping()
public List<Book> getBooks(BookFilter bookFilter){
return bookService.getBooks(bookFilter);
}
答案 4 :(得分:0)
您可以使用PathVariable按字段搜索结果。
@RequestMapping(value = "/book")
@RestController
public class BookController {
@GetMapping
List<Book> getAllBooks()
@GetMapping("/title={title}")
List<Book> getBooksByTitle(@PathVariable String title)
@GetMapping("/author={author}")
List<Book> getBooksByAuthor(@PathVariable String author)
}
将restfull api称为:
'/book'
'/book/title=xxx'
'/book/author=xxx'