SpringBoot中的HATEOAS详情
作者:??程序那些事???? 发布时间:2022-12-27 03:12:31
简介
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);
来源:https://juejin.cn/post/7098227610496270343
猜你喜欢
- 仅供学习交流,禁止商业用途。如侵害利益,联系必删!前言最近一位小伙伴钟爱二次元文化,于是找到半次元这个app,但是很快他就遇到了问题。一、案
- springboot配置mysql数据库spring.datasource.url报错spring.datasource.url=jdbc:
- 1. 源码阅读环境搭建ide:IntelliJ IDEA 2020.1包管理:gradleeureka版本:1.10.11Spring Cl
- 一、流程图二、Token1、token是一种客户端认证机制,是一个经过加密的字符串,安全性强,支持跨域2、用户第一次登录,服务器通过数据库校
- 注解注解定义Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Java 语言中的类、方法、变
- 本文研究的主要是Java中后台线程的相关问题,具体介绍如下。以前从来没有听说过,java中有后台线程这种东西。一般来说,JVM(JAVA虚拟
- Spring Security简介Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的
- 一、定义实体类Person,封装生成的数据package net.dc.test;public class Person { private
- 最近在做的工作要用到本地方法,需要在Java中加载不少动态链接库(以下为方便延用Windows平台下的简写dll,但并不局限于Windows
- 当前使用的IDEA版本是2020.1。随着IDEA版本的升级,有些插件不再支持,而有些插件变成了收费插件,这些插件将不再推荐。以下列举的,都
- Mybatis-plus官网地址:https://baomidou.com/配置mysql在配置文件连接mysqlspring.dataso
- Mybatis有什么用前两天跟阿里的大牛聊天,他讲到对于性能要求高,需求变化多的互联网项目来说,用在sql优化上的开发时间是大头,有时候代码
- 本文实例讲述了java内部类原理与用法。分享给大家供大家参考,具体如下:概念内部类:可以包含在另外一个类中的类外部类:包含内部类的类每个内部
- 前言相信很多Java开发都遇到过一个面试题:Resource和Autowired的区别是什么?这个问题的答案相信基本都清楚,但是这两者在Sp
- java项目中常用maven工具来进行工程管理,但经常遇到的一个问题是生成的jar包越来越大,编译一次工程越来越慢。怎么有效地去除冗余依赖,
- 前言我们知道在Java中除了基础的数据类型以外,其它的都为引用类型。而Java根据其生命周期的长短将引用类型又分为强引用、软引用、弱引用、幻
- 本文实例讲述了Java计算文本MD5加密值的方法。分享给大家供大家参考,具体如下:java计算文本MD5值,用于加密import java.
- Statement 和 PreparedStatement之间的关系和区别. 关系:Prepa
- 本文实例总结了Java JDBC连接数据库常见操作。分享给大家供大家参考,具体如下:db.properties配置文件(MySql数据库)#
- 目前常用的ORM框架有 Mybatis(batis)、MybatisPlus,Hibernate、Jpa等几个框架,今天就简单介绍一下搭建M