使用Spring客户端

时间:2016-01-29 08:45:26

标签: java spring spring-boot spring-data-jpa hateoas

我们有一个使用Spring JPA的API,并通过REST提供对数据库中某些数据的访问。这个API以Hateoas方式公开(我们使用的是Spring实现)。

我们现在正在考虑是否坚持使用此方法或代码s =我们自己的REST接口。现在,我已经阅读了很多关于HATEOAS的文章,但我不确定使用它的最大优势是什么。当然,我知道我可以使用链接浏览它,但我仍然需要了解每个级别链接的存在,对吧?

为了说明我的问题,让我们说我有以下结构:

server.com/
- /store
- /users/

server.com/users
- /managers/
- /other/

server.com/managers
- list of entities with ids

我想要使用此API并让所有经理'实体(位于server.com/users/managers下)

使用Spring启动链接时,这样做的正确方法是什么?

选项一:

  RequestEntity<Void> request = RequestEntity.get("server.com/users/managers").accept(HAL_JSON).build();
  final Resource<Manager> managers = restTemplate.exchange(request, new ResourcesType<Manager>() {
        }).getBody();

选项二:

   // global endpoint
   RequestEntity<Void> request = RequestEntity.get("server.com").accept(HAL_JSON).build();
   final Resource<Object> rootLinks = restTemplate.exchange(request, new ResourceType<Object>() {
        }).getBody();

    Links links = new Links(rootLinks.getLinks());
    final Link userLink = links.getLink("users").expand();

    // users endpoint
    request = RequestEntity.get(URI.create(userLink.getHref())).accept(HAL_JSON).build();
    final Resource<Object> managerLinks = restTemplate.exchange(request, new ResourceType<Object>() {
        }).getBody();

    links = new Links(managerLinks.getLinks());
    final Link managerLink = links.getLink("managers").expand();

    // managers endpoint
    request = RequestEntity.get(URI.create(managerLink.getHref())).accept(HAL_JSON).build();
    final Resources<Manager> resourceAccounts = restTemplate.exchange(request, new ResourcesType<Manager>() {
        }).getBody();

第一个选项似乎很简单,我可以通过单个请求获得所有实体。但是,如果我只是使用这种方法,我就看不到热的Hateoas是有益的。 Spring文档指出,不建议使用硬编码链接。

第二种方法似乎更多的是Hateoas方式,但它创建了三个请求只是为了到达我已经知道的位置的资源。这看起来也不对。

我知道这可能是一个虚假的问题,但是有人可以解释一下,我明显错过了Hateoas背后的好主意吗?

1 个答案:

答案 0 :(得分:0)

使用HATEOAS服务器可以通过提供的链接指导客户端。服务器和客户端之间的契约是链接的关系类型和媒体类型。如果资源处于启用或未启用编辑的状态,或者如果用户被授权对资源进行某些操作等,则服务器可以通过提供或不提供相同资源表示上的链接来提供客户端信息。服务器可以在不违反合同的情况下更改URL。

相关问题