假设您在Spring Data REST中具有一对多或多对多关系。假设您有与用户具有一对多关系的组。如果您从一个组中获得关联列表,您将获得如下链接:
{
"_embedded": {
"users": [
{
"username": "[email protected]",
"enabled": false,
"firstName": "strifng",
"lastName": "sdfdffff",
"_links": {
"self": {
"href": "…/users/78"
}
}
},
{
"username": "test33",
"enabled": true,
"firstName": "sd",
"lastName": "asdfsa",
"_links": {
"self": {
"href": "…/users/77"
}
}
}
}
]
}
如果您试图从组中删除特定用户,那将毫无用处。您要么被迫将PUT
与/groups/{id}/users
一起使用,但是如果您有成千上万的用户,那是不可能的。您can POST
至/groups/{id}/users
并带有URI列表,但您cant DELETE
至/groups/{id}/users
。
为什么?
DELETE的唯一工作方式是调用/groups/{id}/users/{id}
,但是无法从前端构造此URI,因为它没有在集合中返回。
您如何解决这个问题?
您需要在此处使用的模式是访问关联资源,要求其提供text/uri-list
媒体类型,获取所有链接资源的URI,根据需要修改列表,然后将其PUT
返回关联资源。即:
GET /groups/4711/users
200 OK
…/users/3149
…/users/41
…/users/4711
后跟一个:
PUT /groups/4711/users
…/users/3149
…/users/4711
基本上从关联中删除ID为41的用户。
此建议的问题是它当前不起作用🙃。从某种意义上说,由于某些错误,目前无法对URI列表进行查找是有问题的。似乎该功能在某个时候已经失传了(因为它甚至在参考文档中都不再做广告)。好消息是,我已为您提交并修复了a ticket。如果您尝试使用最新快照,则建议的协议应该有效。
通常,很难提供一个API从一般的关联集合中删除单个项目。不幸的是,HTTP DELETE
方法仅在目标URI上运行,并且不接受任何请求正文。即您必须为URI中的各个集合元素提供某种识别机制。据我所知,尚无规范定义如何执行此操作,我们也不想参与定义一个规范的工作。
[一个人可以研究使用JSON补丁请求来收集关联资源之类的功能,但这也不是没有问题。我已提交ticket以跟踪该想法。
首先,很难对其他资源的引用列表进行不断地管理。使用自定义资源扩展资源空间可能是一个更好的选择,该资源可以处理用户从组中的取消分配,并通过自定义链接对其进行广告。