Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Spring HATEOAS放置和发布链接_Java_Spring_Rest_Hateoas_Spring Hateoas - Fatal编程技术网

Java 如何使用Spring HATEOAS放置和发布链接

Java 如何使用Spring HATEOAS放置和发布链接,java,spring,rest,hateoas,spring-hateoas,Java,Spring,Rest,Hateoas,Spring Hateoas,我试图理解如何在SpringHateoas中创建和修改链接 例如,假设我有两个集合,一个位于api/users,另一个位于api/event。我想将用户api/user/56与事件api/event/21相关联。为了便于讨论,这是一个多对多-一个用户可能参加许多活动,一个活动可能有许多用户 据我所知,restful实现这一点的方法是使用URI作为主键,因此我可能会将以下内容发布到api/user/56/events { attends: "http://localhost:9090/ap

我试图理解如何在SpringHateoas中创建和修改链接

例如,假设我有两个集合,一个位于api/users,另一个位于api/event。我想将用户api/user/56与事件api/event/21相关联。为了便于讨论,这是一个多对多-一个用户可能参加许多活动,一个活动可能有许多用户

据我所知,restful实现这一点的方法是使用URI作为主键,因此我可能会将以下内容发布到api/user/56/events

{
    attends: "http://localhost:9090/api/event/21"
}
然后,端点需要能够解析该URL并提取ID(在本例中为21)和控制器(EventController.class),以便我能够持久化该URL

问题1:根据RESTAPI,这是处理SpringHateOAS中关系的正确方法吗

问题2:如何将控制器中的此url解析为数据上的可用句柄(例如对适当控制器/方法的引用、主键等)

研究

RestTemplate可用于从请求映射方法内的控制器请求数据,如下所示

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<EventResource> response = restTemplate.getForEntity(attendsUrl, EventResource.class);
EventResource eventResource = response.getBody();
RestTemplate RestTemplate=new RestTemplate();
ResponseEntity response=restemplate.getForEntity(attendsUrl,EventResource.class);
EventResource=response.getBody();
然而,我不认为eventResource应该返回一个Id字段作为数据的一部分——它不是非常restful的,这将在API上公开。一种方法是使用一个参数“includePK=true”,但这同样感觉不对——它只是隐藏了问题。此外,服务器以这种方式向自己的API发出请求的想法似乎很迂回

更新

这里有一个悬而未决的问题。大致基于该问题的一些评论(由用户提供),我创建了一个快速的util类,在这里提供了一个简单的解决方案:。解决办法归结为:

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);
String-mapping=DISCOVERER.getMapping(targetClass,targetMethod);
UriTemplate template=新的UriTemplate(映射);
//values是被引用方法接受的参数的键/值映射
映射值=uriTemplate.match(uri);

使这一点更好,但它仍然感觉它应该是一个功能。我将试图在spring代码中对此有所了解-当清楚这是怎么回事时,我将回答这个问题。

看看这里的答案:

问题1)是的,这是您发布链接/关系的方式。使用URI

问题2)从客户端的角度来看,资源的URI实际上是它的ID。服务器在内部自动将此URI解析为实际的模型实例


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

您将发布
http://localhost:9090/api/event/21
仅限。Spring HATEOAS不能帮助您取消对URL的引用。它只用于响应,而不是请求。您可能会看一看使用Spring HATEOAS已经几个月了,它显然不支持REST,因此我不得不实施与您描述的类似的解决方法。这是关于Spring HATEOAS的一个问题-尽管Spring Data REST允许有限地使用链接,SpringDataREST没有提供一种实现自己的链接处理功能的方法!你看过我贴的链接了吗?我也花了一段时间去理解这些细微的差别。但与此同时,我发现了如何归档您正在尝试做的事情:Spring Data HATEOAS允许通过发布文本/uri列表来“创建”实体之间的链接,例如:
curl-X PUT-H“ContentType:text/uri列表” http://localhost:8080/api/myEntitty/1
将链接uri作为有效负载
http://localhost:8080/api/myLinkedChildEntity/4711
如果您需要更多的底层访问,您可以在spring rest中实现自己的@RestController