如何从 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)

Spring Data Rest - 在 Json 中禁用自我链接(HAL)

如何在 Spring-Data-Rest 中实现细粒度的访问控制?