SpringBoot中的HATEOAS详情

目录
  • 简介
  • 链接Links
  • URI templates
  • Link relations
  • Representation models
  • 总结

简介

SpringBoot提供了HATEOAS的便捷使用方式,本文详细讲解SpringBoot提供的这些基本方法。

链接Links

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

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

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

<head>
<link rel="stylesheet" type="text/css" href="theme.css" rel="external nofollow"  />
</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。

到此这篇关于SpringBoot中的HATEOAS详情的文章就介绍到这了,更多相关HATEOAS内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 在SpringBoot中使用HATEOAS的方法

    目录 简介 文章目标 构建Entity和Repository 构建HATEOAS相关的RepresentationModel 构建Controller HATEOAS的意义 简介 HATEOAS是实现REST规范的一种原则,通过遵循HATEOAS规范,可以解决我们实际代码实现的各种个问题.作为java最流行的框架Spring当然也会不缺席HATEOAS的集成. 本文将会通过一个具体的例子来讲解如何在SpringBoot中使用HATEOAS. 文章目标 HATEOAS规则中,返回的数据会带有链接.

  • 简单了解SpringBoot HATEOAS使用方法

    REST风格简介 介绍HATEOAS之前先简单介绍一下REST,REST 是 Representational state transfer 的缩写,翻译过来的意思是表达性状态转换.REST是一种架构的风格 Richardson Maturity Model Richardson 提出了REST一种 成熟度模型,我们称之为Richardson Maturity Model,这种模式将REST按照成熟度划分为4个等级 Level0:使用HTTP作为WEB服务的传输方式,以REST样式公开SOAP

  • SpringBoot HATEOAS用法简介(入门)

    REST风格简介 介绍HATEOAS之前先简单介绍一下REST,REST 是 Representational state transfer 的缩写,翻译过来的意思是表达性状态转换.REST是一种架构的风格 Richardson Maturity Model Richardson 提出了REST一种 成熟度模型,我们称之为Richardson Maturity Model,这种模式将REST按照成熟度划分为4个等级 Level0:使用HTTP作为WEB服务的传输方式,以REST样式公开SOAP

  • SpringBoot中的HATEOAS详情

    目录 简介 链接Links URI templates Link relations Representation models 总结 简介 SpringBoot提供了HATEOAS的便捷使用方式,本文详细讲解SpringBoot提供的这些基本方法. 链接Links HATEOAS的一个非常重要的特征就是在resources资源中包含超媒体,而超媒体最简单的表示就是链接. Spring HATEOAS为我们简化了封装Links的功能. 我们看一个HTML中的link标签的例子: <head>

  • SpringBoot中使用Thymeleaf模板详情

    目录 一.什么是Thymeleaf 二.SpringBoot中使用Thymeleaf模板 1.pom.xml中添加thymeleaf依赖 2.关闭thymeleaf缓存 3.创建thymeleaf模板页面 4.创建一个类(用于与上述html页面交互) 5.访问服务路径 一.什么是Thymeleaf 官网原话:Thymeleaf是适用于Web和独立环境的现代服务器端Java模板引擎,能够处理HTML,XML,JavaScript,CSS甚至纯文本. Thymeleaf的主要目标是提供一种优雅且高度

  • springboot中swagger快速启动流程

    介绍 可能大家都有用过swagger,可以通过ui页面显示接口信息,快速和前端进行联调. 没有接触的小伙伴可以参考官网文章进行了解下demo页面. 多应用 当然在单个应用大家可以配置SwaggerConfig类加载下buildDocket,就可以快速构建好swagger了. 代码大致如下: /** * Swagger2配置类 * 在与spring boot集成时,放在与Application.java同级的目录下. * 通过@Configuration注解,让Spring来加载该类配置. * 再

  • SpringBoot中使用@Scheduled注解创建定时任务的实现

    在项目日常开发过程中,经常需要定时任务来帮我们做一些工作,如清理日志.定时任务的实现方法主要有 Timer.Quartz 以及 elastic-job Timer 实现定时任务 只执行一次的定时任务 Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { System.out.println("2000毫米后执行一次."); } }, 2000); timer.s

  • Springboot中如何使用Jackson

    1.SpringMVC中默认集成 SpringMVC已经默认集成了JackSon,如下所示: @RequestMapping("/addUserInfo") public UserInfo addUserInfo(@RequestBody UserInfo userInfo){ } 可以用UserInfo对象来接前台传过来的json,SpringMVC已经帮我们自动反序列化. 可以看到,在SpringBoot中,只需要导入web starter,不需要添加其他的依赖,就可以使用Jack

  • SpringBoot中dubbo+zookeeper实现分布式开发的应用详解

    总体实现思路是启动一个生产者项目注册, 将所含服务注册到zookeeper的注册中心, 然后在启动一个消费者项目,将所需服务向zookeeper注册中心进行订阅, 等待注册中心的通知 注册中心基于负载均衡算法给消费者匹配到合适的生产者主机,然后通知消费者可以使用 实现生产者 导入zookeeper依赖包 <!-- Dubbo Spring Boot Starter --> <dependency> <groupId>org.apache.dubbo</groupI

  • Springboot中MyBatisplus使用IPage和Page分页的实例代码

    一.需求:实现Springboot中MyBatisplus使用IPage和Page分页 二.技术:MyBatisplus的IPage和Page 三.实现 1.代码结构 2.代码详情 (1)Controller package com.xkcoding.rbac.security.controller; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; i

  • SpringBoot中Mybatis + Druid 数据访问的详细过程

    目录 1.简介 2.JDBC 3.CRUD操作 4.自定义数据源 DruidDataSource 1.配置 Druid 数据源监控 2.配置 Druid web 监控 filter 5.SpringBoot 整合mybatis 1. 导入mybatis所需要的依赖 2.配置数据库连接信息 3,创建实体类 4.配置Mapper接口类 6.SpringBoot 整合 1.简介 ​ 对于数据访问层,无论是SQL(关系型数据库) 还是NOSQL(非关系型数据库),SpringBoot 底层都是采用 Sp

  • SpringBoot Mail邮件任务详情

    目录 一.引言 二.简单使用 1.pom包配置 2.在application.properties中添加邮箱配置 3.编写mailService,这里只提出实现类. 4.编写test类进行测试 三.加点料 3.发送html格式邮件 3.发送带附件的邮件 4.在测试类中添加测试方法 5.发送带静态资源的邮件 四.pom中导入thymeleaf的包 五.在resorces/templates下创建emailTemplate.html 六.解析模板并发送 1.发送失败 七.异步发送 一.引言 发送邮件

随机推荐