【问题标题】:How to design Restful uri for ManyToMany Relation如何为多对多关系设计 Restful uri
【发布时间】:2015-08-05 03:53:06
【问题描述】:

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

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

  1. 书可以属于许多类别,例如物理书属于教科书和科学类别。我们可以说这本书有很多类别/标签/标签。
  2. 查看一类图书。
  3. 查看图书的所有类别。
  4. 使用类别或图书信息搜索图书。
  5. 预订 CRUD 操作
  6. 标签 CRUD 操作

考虑到所有这些要求,我选择 Books 和 Labels 之间的 ManyToMany 关系。我已经使用 Hibernate Framework 实现了它。 现在,当涉及到为此设计 Restful 服务时,它变得非常混乱。这也让我质疑表关系的选择。

宁静的 uri 还没有完成。

/书

/books/{bookid}

/标签

/labels/{labelid}

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

/book/{bookid}/labels

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

我想知道我选择的表关系是否正确,如果是,如何针对它设计restful uri。如果不是,请纠正我并说明这种情况。谢谢

【问题讨论】:

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


【解决方案1】:

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}

【讨论】:

    【解决方案2】:

    您的网址看起来不错 - 所以为什么不简单地使用:

    /labels/{labelid}/books
    

    对于“带有标签的书籍”的要求?

    【讨论】:

    • 但是如果我们考虑这个 url,如何获取图书的标签(一本书的标签列表)。然后有两个针对同一资源的 url。泽西岛不允许这样做。 /books/{bookId}/labels
    • 答案中的 URL 返回与特定标签关联的图书列表,而 /books/{bookid}/labels 返回与特定图书关联的标签。我没有看到问题。
    【解决方案3】:

    我会采取不同的策略并支持这些 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      相关资源
      最近更新 更多