如何为多对多关系设计 Restful uri
How to design Restful uri for ManyToMany Relation
我在为正在开发的应用程序选择数据库关系和 Restful URI 时感到困惑。
我正在制作一个具有以下要求的简单图书馆应用程序。
- 书籍可以属于许多类别,例如物理书籍属于教科书和科学类别。可以说书有很多categories/labels/tags.
- 查看某一类别的图书。
- 查看一本书的所有类别。
- 正在使用类别或图书信息搜索图书。
- 图书 CRUD 操作
- 标签 CRUD 操作
考虑到所有这些要求,我选择 ManyToMany 书籍和标签之间的关系。我已经使用 Hibernate Framework 实现了它。
现在,在为此设计 Restful 服务时,它变得非常 confusing.It 让我质疑 table 关系选择。
Restful uri 尚未生成。
/书籍
/books/{bookid}
/标签
/labels/{labelid}
但是当我想获取一本书的标签列表,或者一个标签的图书列表时。如何使用 Restful URI 映射它们。我能想到这个
/book/{bookid}/labels
但是考虑到这一点,如何映射获取一个标签的图书列表
我想知道我选择的table关系是否正确,如果是,如何针对它设计restful uri。如果不是,请纠正我并阐明这种情况。谢谢
您的网址看起来不错 - 为什么不简单地使用:
/labels/{labelid}/books
满足 'books with a label' 要求?
我会采取不同的策略并支持这些 URL:
// 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
Rest URI 是基于 "Resource" 的,您可能应该研究如何以及何时使用 "Sub-Resources"。
table 关系选择完全没问题,如果你想要任何其他复杂的 URI,那么你也可以在你的 URI 中使用 REGEX。您可以按照此 link 查看基于 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}
我在为正在开发的应用程序选择数据库关系和 Restful URI 时感到困惑。
我正在制作一个具有以下要求的简单图书馆应用程序。
- 书籍可以属于许多类别,例如物理书籍属于教科书和科学类别。可以说书有很多categories/labels/tags.
- 查看某一类别的图书。
- 查看一本书的所有类别。
- 正在使用类别或图书信息搜索图书。
- 图书 CRUD 操作
- 标签 CRUD 操作
考虑到所有这些要求,我选择 ManyToMany 书籍和标签之间的关系。我已经使用 Hibernate Framework 实现了它。 现在,在为此设计 Restful 服务时,它变得非常 confusing.It 让我质疑 table 关系选择。
Restful uri 尚未生成。
/书籍
/books/{bookid}
/标签
/labels/{labelid}
但是当我想获取一本书的标签列表,或者一个标签的图书列表时。如何使用 Restful URI 映射它们。我能想到这个
/book/{bookid}/labels
但是考虑到这一点,如何映射获取一个标签的图书列表
我想知道我选择的table关系是否正确,如果是,如何针对它设计restful uri。如果不是,请纠正我并阐明这种情况。谢谢
您的网址看起来不错 - 为什么不简单地使用:
/labels/{labelid}/books
满足 'books with a label' 要求?
我会采取不同的策略并支持这些 URL:
// 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
Rest URI 是基于 "Resource" 的,您可能应该研究如何以及何时使用 "Sub-Resources"。 table 关系选择完全没问题,如果你想要任何其他复杂的 URI,那么你也可以在你的 URI 中使用 REGEX。您可以按照此 link 查看基于 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}