在为我正在开发的应用程序选择数据库关系和Restful URI时,我感到困惑。
我正在制作一个具有以下要求的简单库应用程序。
考虑到所有这些要求,我选择书籍和标签之间的 ManyToMany 关系。我已经使用Hibernate Framework实现了它。 现在,在为此设计Restful Services时,它变得非常混乱。它也使我成为问题表关系的选择。
宁静的uri制作了。
/书籍
/书籍/ {BOOKID}
/标签
/标签/ {labelid}
但是,当我想要获取针对书籍的标签列表或针对标签的书籍列表时。如何使用Restful URI映射它们。我能想到这个
/书/ {BOOKID} /标签
但考虑到这一点,如何映射获取一个标签的书籍列表
我想知道我对表关系的选择是否正确,如果是,如何设计宁静的uri对它。如果不是,请纠正我并对此情况进行说明。感谢
答案 0 :(得分:4)
Rest URI基于“资源”,你应该研究如何以及何时使用“子资源”。 表关系选择完全没问题,如果你想要任何其他复杂的URI,那么你也可以在你的URI中使用REGEX。您可以点击此链接查看基于REGEX的URI匹配。 http://howtodoinjava.com/2013/05/12/jax-rs-path-regex-based-uri-matching/
根据您的情况:
==>获取带有labelId
的所有书籍的列表 ../labels/{labelid}/books
==>检查特定书籍是否与特定标签相关联。
../labels/{labelid}/books/{bookid}
==>获取与书籍相关的所有标签的列表。
../books/{bookid}/labels
==>检查特定标签是否与特定书籍相关联
../books/{bookid}/labels/{labelid}
答案 1 :(得分:3)
您的网址看似合理 - 所以为什么不简单地使用:
/labels/{labelid}/books
是否有“有标签的书籍”要求?
答案 2 :(得分:1)
我会采取不同的方法并支持这些网址:
// get all books
GET /books
// get all books labeled "Sci-fi" and "Romance"
GET /books?label=Sci-fi&label=Romance
// get a specific book
GET /books/1234
// get all labels
GET /labels
// get all labels for book 1234
GET /labels?bookId=1234
// get a specific label
GET /labels/Sci-fi
另一种选择是创建一个映射资源:
// get links to all labels for book 1234
GET /book-labels?bookId=1234
// get links to all books labeled Sci-fi
GET /book-labels?label=Sci-fi