2014-10-09 61 views
7

我想了解如何创建和修改链接在春天HATEOAS。如何把和链接与春天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:这是用REST API处理Spring Hateoas中关系的正确方法吗?

问题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一个悬而未决的问题。基于这个问题的一些评论(用户kevinconaway),我做了一个快速的util类,在这里提供了一个简单的解决方案: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使这个稍微好一些,但它仍然觉得它应该是一个功能。我会寻求在春季代码中获得一些东西 - 当清楚发生了什么时,我会回答这个问题。

+0

您会后通过'http://本地主机:9090/API /事件/ 21'只。 Spring HATEOAS不会帮助您取消引用URL。这只是为了回应,而不是要求。你可能会看看[Spring Data REST](http://projects.spring.io/spring-data-rest/) – zeroflagL 2014-10-13 11:18:03

+0

与Spring HATEOAS一起工作了好几个月,它肯定不会正确支持REST,所以我必须实施类似的解决方法来描述您所描述的内容。 – 2017-01-23 20:43:32

回答

1

看看这里的答案:

POSTing a @OneToMany sub-resource association in Spring Data REST

问题1)是的,这是你如何发布链接/关系。使用URI。

问题2)从客户的角度来看,资源的URI实际上是IS。服务器在内部自动解析这个URI到实际的模型实例与

org.springframework.data.rest.core.UriToEntityConverter.convert(...)

+0

这是一个关于Spring Hateoas的问题 - 虽然Spring Data Rest允许有限地使用链接,但Spring Data Rest没有提供实现链接处理功能的方法。 – 2017-01-30 22:52:13

+0

你好安德鲁!你看过我发布的链接了吗?这也让我花了一段时间来了解细微的差异。但同时我发现了如何将你想要做的事情归档:Spring Data HATEOAS允许通过发布文本/ URI列表来“创建”实体之间的链接。像这样:'curl -X PUT -H“ContentType:text/uri-list”http:// localhost:8080/api/myEntitty/1“,链接uri作为有效载荷”http:// localhost:8080/api/myLinkedChildEntity/4711'如果你需要更多的低级访问,你可以在spring rest中实现你自己的@RestController – Robert 2017-02-01 14:54:06