【发布时间】:2014-12-05 00:10:36
【问题描述】:
我正在尝试了解如何在 Spring HATEOAS 中创建和修改链接。
例如,假设我有两个集合,一个在 api/users,另一个在 api/event。我想将用户 api/user/56 与事件 api/event/21 相关联。出于争论的原因,这是多对多的——一个用户可能参加很多活动,一个活动可能有很多用户。
据我了解,最好的方法是使用 URI 作为主键,因此我可能会将以下内容发布到 api/user/56/events;
{
attends: "http://localhost:9090/api/event/21"
}
然后端点需要能够解析该 URL 并提取 ID(在本例中为 21)和控制器(EventController.class),以便我可以持久保存它。
问题 1:这是在 Spring Hateoas 中根据 REST API 处理关系的正确方法吗?
问题 2:如何在控制器中将此 url 解析为数据的可用句柄(例如对适当控制器/方法的引用、主键等)
研究
RestTemplate 可用于从请求映射方法内部的控制器请求数据,如下所示;
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<EventResource> response = restTemplate.getForEntity(attendsUrl, EventResource.class);
EventResource eventResource = response.getBody();
但是我不认为 eventResource 应该返回一个 Id 字段作为数据的一部分 - 它不是很安静,这会暴露在 API 上。一种方法是使用参数“includePK=true”,但这又感觉不对——它只是隐藏了问题。此外,服务器以这种方式向自己的 API 发出请求的想法似乎很迂回。
更新
这里有一个悬而未决的问题https://github.com/spring-projects/spring-hateoas/issues/292。基于该问题中的一些 cmets(用户 kevinconaway),我制作了一个快速实用程序类,在这里提供了一个简单的解决方案:SpringHateoasUtils。解决方案归结为;
String mapping = DISCOVERER.getMapping(targetClass, targetMethod);
UriTemplate template = new UriTemplate(mapping);
//values is key/value map of parameters that the referenced method accepts
Map<String, String> values = uriTemplate.match(uri);
SpringHateoasUtils 使它稍微好一点,但它仍然感觉应该是一个功能。我将寻求在 spring 代码中得到一些东西——当它清楚发生了什么时,我会回答这个问题。
【问题讨论】:
-
您只能发布
http://localhost:9090/api/event/21。 Spring HATEOAS 不能帮助您取消引用 URL。它仅用于响应,而不是请求。你可以看看Spring Data REST -
已经使用 Spring HATEOAS 几个月了,它似乎确实不能正确支持 REST,所以我不得不实施与您所描述的类似的解决方法。
标签: java spring rest hateoas spring-hateoas