假设我有一个现有的应用程序,它有两个端点/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"
覆盖/people
RequestMapping,则可以使用Accept="application/json"获取“原始”json,但是如果我传递Accept="application/hal+json"
,我会收到406和“找不到可接受的表示”的错误。看起来SDR资源映射没有与内容类型映射...有任何建议吗?