简介

SpringBoot提供了HATEOAS的便捷使用方式,前面一篇文章我们也讲了如何在SpringBoot中使用HATEOAS。本文将会对这些内容进行扩展深入,详细讲解SpringBoot提供的这些基本方法。

链接Links

HATEOAS的一个非常重要的特征就是在resources资源中包含超媒体,而超媒体最简单的表示就是链接。

Spring HATEOAS为我们简化了封装Links的功能。

我们看一个HTML中的link标签的例子:

<head>
<link rel="stylesheet" type="text/css" href="theme.css" />
</head>

可以看到一个link有两个比较重要的属性,一个是href代表link的链接,还有一个属性是rel表示的当前文档与被链接文档之间的关系。

我们看下Link中的关键方法:

	public static Link of(String href) {
return new Link(href);
} public static Link of(String href, String relation) {
return new Link(href, relation);
} public static Link of(String href, LinkRelation relation) {
return new Link(href, relation);
}

可以传入href和relation来构建一个Link对象。

看下面的例子:

Link link = Link.of("/something");

link = Link.of("/something", "my-rel");

其中LinkRelation是关联关系的一个封装接口,注意,它是一个接口,我们可以使用IanaLinkRelations中的具体实现来对其赋值,如下所示:

LinkRelation REL_SELF = IanaLinkRelations.SELF;
LinkRelation REL_FIRST = IanaLinkRelations.FIRST;
LinkRelation REL_PREVIOUS = IanaLinkRelations.PREV;
LinkRelation REL_NEXT = IanaLinkRelations.NEXT;
LinkRelation REL_LAST = IanaLinkRelations.LAST;

URI templates

上面的例子中link是指定好的,是静态的。有时候我们希望link可以根据参数进行变换,那么这样的link就是动态的link,我们可以通过定义URI模板来实现。

所以Link还可以通过UriTemplate来构建:

	public static Link of(UriTemplate template, String relation) {
return new Link(template, relation);
} public static Link of(UriTemplate template, LinkRelation relation) {
return new Link(template, relation);
}

UriTemplate是对URI模板的封装,我们看一个使用的例子:

Link link = Link.of("/{segment}/something{?parameter}");

Map<String, Object> values = new HashMap<>();
values.put("segment", "path");
values.put("parameter", 42); assertThat(link.expand(values).getHref())
.isEqualTo("/path/something?parameter=42");

上面的例子中,通过string来构建一个link,然后调用expand传入参数对应的map,来构建真实的href值。

除了直接使用string之外,还可以传入UriTemplate:

UriTemplate template = UriTemplate.of("/{segment}/something")
.with(new TemplateVariable("parameter", VariableType.REQUEST_PARAM); assertThat(template.toString()).isEqualTo("/{segment}/something{?parameter}");

Link relations

Link relations指的是link中的ref属性。代表的是当前文档与被链接文档之间的关系。Spring HATEOAS中有一个LinkRelation类来表示。

IANA(Internet Assigned Numbers Authority)预定义了一些relations,可以通过IanaLinkRelations这个类来获取,如下所示:

Link link = Link.of("/some-resource"), IanaLinkRelations.NEXT);

assertThat(link.getRel()).isEqualTo(LinkRelation.of("next"));
assertThat(IanaLinkRelation.isIanaRel(link.getRel())).isTrue();

Representation models

我们需要访问的是一个个的资源,然后需要在一个个的资源中加入link,Spring HATEOAS为我们提供了一个简单的类叫做RepresentationModel。它包含了Links和一些很方便的方法来帮助我们创建带链接的资源。

最简单的使用方法就是创建一个RepresentationModel的子类:

public class BookModel extends RepresentationModel<BookModel> {

    private final Book content;

}

我们通过add方法来对其添加link:

bookModel.add(linkTo(methodOn(BookController.class).getBook(id)).withSelfRel());

注意,在这种情况下,我们的Accept类型应该是application/hal+json。

对于简单类型,我们可以直接使用EntityModel对其进行封装:

Person person = new Person("Dave", "Matthews");
EntityModel<Person> model = EntityModel.of(person);

对于集合,可以使用CollectionModel:

Collection<Person> people = Collections.singleton(new Person("Dave", "Matthews"));
CollectionModel<Person> model = CollectionModel.of(people);

总结

上讲解的Link,URI templates,Link relations和RepresentationModel就是Spring HATEOAS的基础,掌握了他们基本上就掌握了Spring HATEOAS。

更多内容请参考 http://www.flydean.com/00043-springboot-hateoas-fundamentals/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

SpringBoot之:SpringBoot的HATEOAS基础的更多相关文章

  1. springboot集成swagger实战(基础版)

    1. 前言说明 本文主要介绍springboot整合swagger的全过程,从开始的swagger到Knife4j的进阶之路:Knife4j是swagger-bootstarp-ui的升级版,包括一些 ...

  2. 使用 Liquibase 管理数据库版本 - SpringBoot 2.7 .2 实战基础

    优雅哥 SpringBoot 2.7 .2 实战基础 - 05 -使用 Liquibase 管理数据库版本 在企业开发中,数据库版本管理好像是一个伪命题,大多项目都是通过 Power Designer ...

  3. 多环境配置 - SpringBoot 2.7.2 实战基础

    优雅哥 SpringBoot 2.7.2 实战基础 - 06 -多环境配置 在一个项目的开发过程中,通常伴随着多套环境:本地环境 local.开发环境 dev.集成测试环境 test.用户接受测试环境 ...

  4. 清晰梳理最全日志框架关系与日志配置-SpringBoot 2.7.2 实战基础

    优雅哥 SpringBoot 2.7.2 实战基础 - 07 - 日志配置 Java 中日志相关的 jar 包非常多,log4j.log4j2.commons-logging.logback.slf4 ...

  5. 集成 Redis & 异步任务 - SpringBoot 2.7 .2实战基础

    SpringBoot 2.7 .2实战基础 - 09 - 集成 Redis & 异步任务 1 集成Redis <docker 安装 MySQL 和 Redis>一文已介绍如何在 D ...

  6. springBoot系列-->springBoot注解大全

    一.注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan.@Configuration和@EnableAutoConfiguration ...

  7. 【SpringBoot】SpringBoot配置与单元测试(二)

    SpringBoot项目创建参考[SpringBoot]SpringBoot快速入门(一) 本文介绍SpringBoot项目的POM文件.配置与单元测试 POM文件 1.SpringBoot的pom文 ...

  8. 【SpringBoot】SpringBoot 入门示例

    参考资料: http://www.tuicool.com/articles/mqeee2A http://www.cnblogs.com/suncj/p/4065589.html http://spr ...

  9. [SpringBoot] - 了解什么是SpringBoot,使用SpringBoot的配置文件

    首先明白Spring是什么,Spring是Java开发的一个框架,为了方便简化Java开发. 什么是注解(注解式开发)? Spring的常用注解有哪些? 假如用SpringBoot构建一个网站程序,应 ...

  10. Springboot】Springboot整合邮件服务(HTML/附件/模板-QQ、网易)

    介绍 邮件服务是常用的服务之一,作用很多,对外可以给用户发送活动.营销广告等:对内可以发送系统监控报告与告警. 本文将介绍Springboot如何整合邮件服务,并给出不同邮件服务商的整合配置. 如图所 ...

随机推荐

  1. 『现学现忘』Git基础 — 3、Git介绍

    目录 1.Git的历史 2.Git的特点 3.Git在项目协作开发中所解决的问题 1.Git的历史 Git是目前世界上最先进的分布式版本控制系统,开源.免费. Git 是 Linus (林纳斯)为了帮 ...

  2. SpringMVC踩的第一个坑——Servlet.init()引发异常

    正确的设置了第一个SpringMVC相关的配置,初始启动服务器时,报404,经过排查,是项目生成构建的时候没有导入好依赖,手动在项目结构里面新建lib目录添加依赖解决了404的问题,重新部署以后开始报 ...

  3. Intellij IDEA 2022 正式发布,这些功能真不错

    Intellij IDEA 2022 正式发布了,作为正版用户,胖哥赶紧更新了一波,好家伙!这几个功能确实很香啊.新版更新的东西真不少,不愧是一个大版本更新. 依赖分析 IDEA的依赖检查.依赖冲突解 ...

  4. 2021.11.09 P4824 [USACO15FEB]Censoring S与P3121 [USACO15FEB]Censoring G(KMP&&AC自动机)

    2021.11.09 P4824 [USACO15FEB]Censoring S与P3121 [USACO15FEB]Censoring G(KMP&&AC自动机) https://w ...

  5. 元素滚动 scroll 系列

    定义 : scroll翻译过来就是滚动的,我们使用scroll系列的相关属性可以动态的得到该元素的大小.滚动距离等. 常用属性 : 需要用到页面滚动事件scroll因为是页面滚动,所以事件源是docu ...

  6. Python获取文件夹下的所有文件名

    1 #获取文件夹内的图片 2 import os 3 def get_imlist(path): 4 return [os.path.join(path,f) for f in os.listdir( ...

  7. @Resource与构造函数踩坑

    (虽然解决了需求,但我还是没搞懂为什么构造函数结束后,调用userMapper注入还是为空!) 首先,我有一个没有问题的userMapper类,用于处理user的数据库处理. 其次,我在另一个类里面使 ...

  8. python学习-Day33

    目录 今日内容详细 socket socket套接字简介 socket模块 服务端 客户端 通信循环 服务端 客户端 链接循环 半连接池 概念 产生半连接的两种情况 黏包问题 多次发送被并为一次 TC ...

  9. XCTF练习题---CRYPTO---不仅仅是Morse

    XCTF练习题---CRYPTO---不仅仅是Morse flag:cyberpeace{attackanddefenceworldisinteresting} 解题步骤: 1.观察题目,下载附件 2 ...

  10. 【论文笔记】A review of applications in federated learning(综述)

    A review of applications in federated learning Authors Li Li, Yuxi Fan, Mike Tse, Kuo-Yi Lin Keyword ...