【问题标题】:How to add relationships in JAX-RS via RESTful web service?如何通过 RESTful Web 服务在 JAX-RS 中添加关系?
【发布时间】:2015-09-12 15:52:21
【问题描述】:

好的,我可以在我的 RESTful Web 服务中获取 POST PUT DELETE 简单资源(实体)

例如

/rest/foos
/rest/foos/1 

/rest/bars
/rest/bars/1

但是如何处理添加关系。 @OneToMany,@ManyToMany 之间的这种关系使用 RESTful Web 服务。 假设我有几个 Foo 实体和几个 Bar 实体如何建立关系 Bar 1 有 Foo 3 等等。

我有这样的方法来获得这种关系:

GET /rest/bars/1/foos 

Above 返回与 Bar(id=1) 相关的 foo 集合

我想可能会这样做:

POST /rest/bars/1/foos   { # Foo json object } 

上面将创建新的 Foo 对象并在这个新对象和 Bar(id=1) 之间建立关联。

PUT /rest/bars/1/foos/2  { # Foo json object } 

如果与 Bar(id=1) 存在这样的关联,或者如果没有这样的关联并且 Foo(id=2) 存在于 Foo 表中,则上述更新 Foo(id=2) 将进行这样的关联。

如果我想只添加/更新没有关联的 Foo,我做了如下所示:

POST /rest/foos
PUT  /rest/foos/2 

如果我想删除 Foo(id=2)

DELETE /rest/foos/2 

如果我只想删除 Bar(id=1) 和 Foo(id=2) 之间的关联

DELETE /rest/bars/1/foos/2 

您如何看待这种方法?你将如何正确处理这个问题?

【问题讨论】:

    标签: rest jax-rs restful-url restful-architecture


    【解决方案1】:

    关于您的 OneToMany 关系How to model parent child entities via REST 可能会对您有所帮助。

    与其父级的关联是子资源的一个属性,因此 OneToMany 关系应在 many 端进行管理。

    PUT /rest/bars/1/foos/2  { # Foo json object }
    

    如果您的foos 只能与bar 相关联,但如果它们也可以在没有bar 的情况下存在,您应该使用不从属于bar 资源的专用foo 资源。想想聚合组合

    如果我只想删除 Bar(id=1) 和 Foo(id=2)

    删除 /rest/bars/1/foos/2

    我不会使用这种方法,而是将foo 更新为id=2,使其不再与bar 1 关联。 DELETE /rest/bars/1/foos/2 应该删除完整的 foo 资源,而不仅仅是我认为的关联。

    关于多对多关系,您需要第三个资源来直接操作连接表。为了简化这一点,这个资源只需要定义POSTDELETE 操作。 POST 添加一个新的关联对:到 ids,一个用于bar,一个用于fooDELETE 删除这样的一对。

    【讨论】:

    • 好的,在 \@OneToMany 关系的情况下,在多方面建立这种关联是有意义的,因为我可以在那里发布/放置/删除这样的关联。但是在 \@ManyToMany 关系的情况下,我考虑如何直接访问 Join Table 以便 POST/DELETE 此关联不会是 DELETE /rest/bars/1/foos/2 是指示删除内容的好方法,即Bar 1 和 Foo 2 的关系?其他方法似乎类似于 DELETE /rest/bar-foo-relationship/1+2
    • foobar 的孩子吗?如果不是,为什么不是rest/foos/2/bars/1?我会使用类似于第二种方法的方法,您的第一种方法有问题,因为您通过发布到bars/1/foos 创建了一个新的foo,所以我希望bars/1/foos/2 是代表foo 的资源,但它只代表他们之间的关联。这将混合两种不同的资源含义。
    • 好的,例如提供商和行业。它们之间存在多对多关系,即提供者可以属于许多行业,而行业可以在其中定义许多提供者。因此,应该在没有提供者的情况下访问和创建行业,例如 /rest/industries 和 /rest/industries/1,也应该像 /rest/providers/1 一样独立访问提供者。但是要访问 Provider 其相关行业,我认为 /rest/providers/1/industries 将是合乎逻辑的。但是如何最好地进行关联和删除呢?你觉得 /rest/provider-industry-relationship/{id1}+{id2} 会更好吗
    • 首先尝试为这种更以域为中心的关系找到一个更好的名称。如果没有更合适的名称,请使用此路径,但删除 relationship 并使用复数名词。或使用providersToIndustries/1to2 或使用您想要的任何分隔符。我认为 API 设计应该是关于语义的。您还可以使用查询参数来描述 id1 和 id2。
    • 所以也许我最终会做类似 /rest/providers-industries/1+2 或 /rest/providers-industries?providerId=1&industryId=2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 2011-03-02
    • 2013-06-03
    • 1970-01-01
    相关资源
    最近更新 更多