如何为ManyToMany关系设计Restful uri

时间:2015-08-05 03:53:07

标签: rest jersey entity-relationship restful-url restful-architecture

在为我正在开发的应用程序选择数据库关系和Restful URI时,我感到困惑。

我正在制作一个具有以下要求的简单库应用程序。

  1. 书籍可以属于许多类别,例如物理书籍属于教科书和科学类别。我们可以说书有很多类别/标签/标签。
  2. 在一个类别中查看图书。
  3. 查看图书的所有类别。
  4. 使用类别或图书信息搜索图书。
  5. 预订CRUD操作
  6. 标记CRUD操作
  7. 考虑到所有这些要求,我选择书籍和标签之间的 ManyToMany 关系。我已经使用Hibernate Framework实现了它。 现在,在为此设计Restful Services时,它变得非常混乱。它也使我成为问题表关系的选择。

    宁静的uri制作了。

    /书籍

    /书籍/ {BOOKID}

    /标签

    /标签/ {labelid}

    但是,当我想要获取针对书籍的标签列表或针对标签的书籍列表时。如何使用Restful URI映射它们。我能想到这个

    /书/ {BOOKID} /标签

    但考虑到这一点,如何映射获取一个标签的书籍列表

    我想知道我对表关系的选择是否正确,如果是,如何设计宁静的uri对它。如果不是,请纠正我并对此情况进行说明。感谢

3 个答案:

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