【问题标题】:Optionally disable HATEOAS format in Spring Data Rest可选择在 Spring Data Rest 中禁用 HATEOAS 格式
【发布时间】:2015-01-20 03:55:51
【问题描述】:

假设我有一个现有的应用程序,它有两个端点 /people 和 /pants。调用 GET /people 返回:

[
    {
        "name":"john",
        "age":37,
        "pants":[
            {
                "color":"green",
                "brand":"levis",
                "size":"medium"
            },
            {
                "color":"indigo",
                "brand":"jncos",
                "size":"medium-with-huge-legs"
            }
        ]
    },
    {
        "name":"june",
        "age":23,
        "pants":[
            {
                "color":"pink",
                "brand":"gap",
                "size":"small"
            }
        ]
    }
]

如果我要使用 Spring Data Rest 并调用 GET /person,我会收到如下信息:

{
    "_links":{
        "next":{
            "href":"http://myapp.com/people?page=1&size=20"
        },
        "self":{
            "href":"http://myapp.com/people{&page,size,sort}",
            "templated":true
        },
        "search":{
            "href":"http://myapp.com/people/search"
        }
    },
    "_embedded":{
        "people":[
            {
                "name":"john",
                "age":37,
                "_links":{
                    "self":{
                        "href":"http://myapp.com/people/john"
                    },
                    "pants":{
                        "href":"http://myapp.com/people/john/pants"
                    }
                }
            },
            {
                "name":"june",
                "age":23,
                "_links":{
                    "self":{
                        "href":"http://myapp.com/people/june"
                    },
                    "pants":{
                        "href":"http://myapp.com/people/june/pants"
                    }
                }
            }
        ]
    }
}

假设我有一堆我不想更改的现有客户端 - 有没有办法在某些情况下禁用响应的超媒体部分(比如 Accept="application/json")但启用为其他人(Accept="hal+json")?

谢谢!

更新

好的 - 所以我很懊恼,我想做的事情不受支持。我理解为什么 Spring Data Rest 强烈倾向于超媒体……但我不认为提供基于标头“禁用”超媒体的能力,从而提供更多选项是一件坏事。

除此之外,我有点不确定如何通过我自己的控制器实际实现这一点。如果我创建一个控制器并尝试用produces = "application/json" I am able to get the "raw" json back with Accept="application/json" but if I pass Accept="application/hal+json"` 覆盖/people RequestMapping,我会得到一个带有“找不到可接受的表示”的406。看起来 SDR 资源映射没有与内容类型映射...有什么建议吗?

【问题讨论】:

  • 是的,您可以使用不同的 Accept 标头。
  • 乔纳森,问题不在于如何知道 何时 返回非仇恨响应,而是如何让 Spring Data Rest 不生成超媒体元素在响应中。
  • 我相信 Spring Data REST 为此使用了两个不同的 HttpMessageConverters,并且它们在一个链中。如果 Accept 标头指示 application/hal+json,则 TypeConstrainedMappingJackson2HttpMessageConverter 将处理它并生成 HAL。但是,如果标头只是 'application/json',则常规 MappingJackson2HttpMessageConverter 会启动并且不会序列化为 HAL。不确定这是否有帮助,但我会考虑尝试调整后一个转换器以不返回超媒体链接。

标签: rest spring-data spring-data-rest hateoas hypermedia


【解决方案1】:

简短的回答是,你不能在没有仇恨的情况下使用 spring-data-rest。如果你想在没有 hatoas 的情况下构建你的 web 服务,你必须编写自己的控制器(仍然可以使用 spring-data 存储库)。

this SO post 中引用 Oliver Gierke:

实际上我的全部观点是:服务器只是在做体面的 REST。如果 破坏客户,需要修复的是客户 (调整)。所以超媒体方面是 Spring 的基础 数据 REST,我们不会放弃。那可能不是 对您的具体情况感到满意,但应该回答这个问题 至少 :)。 ——奥利弗·吉尔克

【讨论】:

  • 我很惊讶你不能覆盖序列化器/消息转换器只是不输出链接......似乎应该是可能的
  • 我接受了这个答案,但 7 年后,我仍然根本不同意 Drotbohm 对 HATEOAS 的坚持。我认为时间继续向我们表明,实际上,很少有消费者真正感兴趣或能够利用这些功能。
  • 7 年后,我同意你的看法。 :)
猜你喜欢
  • 2013-10-31
  • 2014-03-07
  • 2018-07-23
  • 2015-03-08
  • 2014-08-16
  • 2016-05-23
  • 2014-07-05
  • 2015-04-26
  • 2018-11-26
相关资源
最近更新 更多