【发布时间】: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