我们有一个使用Spring JPA的API,通过REST方式提供对数据库中某些数据的访问。我们以HATEOAS形式公开此API(使用Spring实现)。
现在我们正在考虑是坚持使用这种方法还是手动编写自己的REST接口。我已经阅读了很多关于HATEOAS的文章,但不确定使用它的重大优势是什么。当然,我知道可以使用链接浏览它,但我仍然必须知道每个级别的链接是否存在,对吗?
为了说明我的问题,假设我有以下结构:
选项二:
第一种方法似乎很直接,我可以通过单个请求获取所有实体。然而,如果我只使用这种方法,我无法看到Hateoas的好处。Spring文档指出,不建议使用硬编码链接。
第二种方法似乎更符合Hateoas的风格,但它需要创建三个请求才能访问资源,而我已经知道了该资源的位置。这也不太对。
我知道这可能是一个愚蠢的问题,但有人能解释一下我明显忽略的Hateoas背后的伟大思想吗?
现在我们正在考虑是坚持使用这种方法还是手动编写自己的REST接口。我已经阅读了很多关于HATEOAS的文章,但不确定使用它的重大优势是什么。当然,我知道可以使用链接浏览它,但我仍然必须知道每个级别的链接是否存在,对吗?
为了说明我的问题,假设我有以下结构:
server.com/
- /store
- /users/
server.com/users
- /managers/
- /other/
server.com/managers
- list of entities with ids
我希望使用这个API并获取所有“manager”实体(位于server.com/users/managers
下)。
当使用Spring Boot链接时,正确的方法是什么?
选项一:
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背后的伟大思想吗?