哪些映射用于GET请求?

时间:2018-04-27 12:27:00

标签: java rest

我有一个关于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/"似乎不是一个好选择。

我可以向我建议什么样的解决方案?

5 个答案:

答案 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请求可以由任何人兑现活跃期内网络的一部分)。

注意: 在我看来GETtitle不是域对象,因此我不使用像{{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成熟度模型,则应将您的终端视为资源。 这意味着您可以考虑使用带有查询参数的一个资源来过滤结果:

  • GET / books
  • GET / books?title = {title}
  • GET / books?author = {author}

另一种方法可能是考虑“标题”资源和“作者”资源,这些资源将提供书籍实体的链接

  • GET / books
  • GET / titles / {title} //返回一个匹配的标题列表,其中包含链接/ book / {id}
  • GET / authors / {author} //返回匹配作者的列表,其中包含链接/ book / {id}

答案 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'