【问题标题】:Spring data rest Hateoas - How to deal with different uris for the same entitySpring data rest Hateoas - 如何处理同一实体的不同uri
【发布时间】:2015-02-19 19:16:11
【问题描述】:

我通过用户存储库以以下形式公开了 Item 实体:

http://localhost:8080/api/users/0/items

并通过项目存储库公开为:

http://localhost:8080/api/items

只有后面的接受post,第一个不支持post action。

如果客户得到

http://localhost:8080/api/users/0/items/1

并尝试更新它返回的项目:

"status": 405,
"error": "Method Not Allowed",

通过以下网址更新可以正常工作:

http://localhost:8080/api/items/1

有没有办法允许在两个存储库上进行更新是否有意义,或者有没有办法告诉客户端它应该使用哪个 url 以一种安静的方式进行发布操作?

【问题讨论】:

  • 你使用 Spring Data REST 吗?如果是这样,那么http://localhost:8080/api/users/0/items 是关联资源,而不是集合资源。
  • 是的,我将 SDR 与 Neo4j 一起使用。这对我来说是新的。如果是关联资源呢?不允许通过它发布新资源吗?如果是这样,消费者如何知道要发布到哪个 url 以创建新的关联资源?
  • 您设计存储库的方式itemsusers 彼此独立。您只需发布到它们各自的集合 URI 以创建新资源。如果您想在两者之间建立联系,您可以发布例如URI(!) http://localhost:8080/api/items/1 到关联资源 http://localhost:8080/api/users/0/items。这会将用户 0 与项目 1 相关联。
  • 好吧,这很有趣。但我的意思更像是一个客户端,它通过用户的items 链接从http://localhost:8080/api/users/0 检索了一个用户,并从http://localhost:8080/api/users/0/items 检索了相关项目的列表。它如何知道项目存储库在哪里创建新项目? hatoas 的全部意义在于客户端不必知道网址我错了吗?所以它必须检查一个项目上的自我链接,但是如果关联的项目列表还空呢?
  • 一般来说,客户端使用(不仅仅是浏览!)你的API必须有一些关于它的先验知识。它必须知道用户是什么,物品是什么等。所以它还必须知道物品有一个端点。它可以通过调用http://localhost:8080/api/ 并检索items 的链接来获取该端点的地址。因此,虽然 HATEOAS 不需要提前知道地址,但它仍然需要客户端具备一些知识才能明智地使用 API。

标签: rest repository spring-hateoas


【解决方案1】:

usersitems拥有自己的存储库。这意味着item 不绑定到特定的user - 它可以不属于、任何或多个users,具体取决于您的约束。这也意味着user 存储库不控制items 的生命周期。换句话说,将item 发布到任何以/api/users 开头的URL 都超出了范围。

/api/users/0/items 是所谓的关联资源。它用于在useritem 之间建立关系。这是通过将item 的URI 发布到此URL 来完成的。但该项目必须存在。

由此产生的问题是客户应该如何知道?您正确地指出,HATEOAS 的要点是客户端不必知道链接,或者更糟糕的是,必须手动创建它们。请注意,不知道链接和不知道 API 之间存在巨大差异。不知道/api/items 和不知道有一个项目存储库是不一样的。还有例如在不知道 user 是什么的情况下 - 从语义上讲 - 使用 API 没有意义。

还有其他选择吗?并不真地。您可以实现一个控制器来处理对/api/users/0/items 的请求。但这对每个关联资源来说都是很多工作。您可以通过ResourceProcessor 将项目存储库的链接添加到每个user。但这可能会令人困惑,因为您将拥有一个链接 items 和一个 itemRepositoryaddItems

【讨论】:

  • 如何将项目发布到api/items,并将用户 uri 分配给项目的用户相关字段。好像可以,有什么问题?
  • 我的意思是不要发布新项目,然后单独发布关联。
  • @aycanadal 你没有提到关系是双向的。但是,当然,发布包含关联 URI 的资源是一个好方法 :)
猜你喜欢
  • 2012-10-04
  • 1970-01-01
  • 2018-08-22
  • 2013-10-31
  • 2014-03-07
  • 1970-01-01
  • 2016-07-06
  • 1970-01-01
  • 2014-08-16
相关资源
最近更新 更多