【问题标题】:How to remove hypermedia elements from representations produced by Spring Data REST?如何从 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。或者至少,你可以忍受它暴露这些特殊特征。如果你想建立打破这些原则的客户,那很好。只是不要指望框架会使错误的事情变得容易/可能吗????.

标签: spring rest spring-boot spring-data spring-data-rest


【解决方案1】:

没有。超媒体是 REST API 的基本特征,Spring Data REST 大量使用它来允许您构建客户端,这些客户端可以使用响应中存在的链接导航到相关资源。

当然,您可以让您的客户端不使用该信息,但这会导致更紧密的耦合(因为您无法再更改服务器端的 URI,您的客户端希望与专门的服务器,而使用超媒体,您可以将其指向不同的服务器等)。

与许多其他自称的 REST 框架相比,框架设计的关键方面之一是尊重 REST 的基本原则并明确利用它们。或者至少,不要创造容易破坏它们的动机。这在reference documentationproject website 中明确表达。在this presentation on Spring Data RESTthis one on Domain-Driven Design & REST 中了解有关关键设计决策的更多信息。

【讨论】:

    猜你喜欢
    • 2017-01-18
    • 2018-12-26
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 2022-10-13
    • 2015-12-07
    • 1970-01-01
    • 2016-05-14
    相关资源
    最近更新 更多