如何从 Spring Data REST 生成的表示中删除超媒体元素?
Posted
技术标签:
【中文标题】如何从 Spring Data REST 生成的表示中删除超媒体元素?【英文标题】:How to remove hypermedia elements from representations produced by Spring Data REST? 【发布时间】:2016-09-24 21:28:54 【问题描述】:将 Spring Data 用于我的 REST API 时,当前返回的响应包括 _links
字段:
"_embedded":
"users": [
"imageUrl": "some_image_url",
"name": "some name",
"id": "57420b2a0d31bb6cef4ee8e9",
"_links":
"self":
"href": "http://localhost:8080/users/57420b2a0d31bb6cef4ee8e9"
,
"user":
"href": "http://localhost:8080/users/57420b2a0d31bb6cef4ee8e9?projection",
"templated": true
,
...
有没有办法产生输出,例如隐藏_links
字段?例如:
"_embedded":
"users": [
"imageUrl": "some_image_url",
"name": "some name",
"id": "57420b2a0d31bb6cef4ee8e9",
,
...
我发现因为我公开了id
字段,所以_links
并不是真正必要的,而且大多数情况下只是弄乱了我的回复。
【问题讨论】:
客户应该如何知道在没有链接的情况下在哪里可以找到用户? @OliverGierke 我在回复中暴露了id
字段。
客户端如何处理不是 URI 的纯字符串?
@OliverGierke 我在我的 android 应用程序中使用这个 API,并且我正在使用 Retrofit。通过它的所有请求都已经定义了端点 (http://the_host:port/
),所以我只需要 /user/id。 /user/ 部分是在我使用的方法中定义的 (getUser()
)。所以我只需要 ID 字段,所以我可以打电话给getUser(id)
。
所以您的客户端正在自己构建 URI。这打破了 REST 的基本概念(请参阅roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven)。 Spring Data REST 是建立在您想要构建一个 REST API(因此得名)的假设之上的,而不仅仅是一个 HTTP/JSON API。或者至少,你可以忍受它暴露这些特殊特征。如果你想建立打破这些原则的客户,那很好。只是不要指望框架会使错误的事情变得容易/可能吗????.
【参考方案1】:
没有。超媒体是 REST API 的基本特征,Spring Data REST 大量使用它来允许您构建客户端,这些客户端可以使用响应中存在的链接导航到相关资源。
当然,您可以让您的客户端不使用该信息,但这会导致更紧密的耦合(因为您无法再更改服务器端的 URI,您的客户端希望与专门的服务器,而使用超媒体,您可以将其指向不同的服务器等)。
与许多其他自称的 REST 框架相比,框架设计的关键方面之一是尊重 REST 的基本原则并明确利用它们。或者至少,不要创造容易破坏它们的动机。这在reference documentation 和project website 中明确表达。在this presentation on Spring Data REST 和this one on Domain-Driven Design & REST 中了解有关关键设计决策的更多信息。
【讨论】:
以上是关于如何从 Spring Data REST 生成的表示中删除超媒体元素?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Spring Data Rest 时如何从组件扫描中排除 @Repository
如何简单地添加指向 Spring Data REST 实体的链接
我可以让自定义控制器镜像 Spring-Data-Rest / Spring-Hateoas 生成的类的格式吗?
Jason中的Spring Data Rest -Disable自我链接(HAL)