返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot中的HATEOAS详情
  • 501
分享到

SpringBoot中的HATEOAS详情

2024-04-02 19:04:59 501人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录简介链接LinksURI templatesLink relationsRepresentation models总结简介 SpringBoot提供了HATEOAS的便捷使用方式

简介

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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringBoot中的HATEOAS详情

本文链接: https://lsjlt.com/news/148936.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringBoot中的HATEOAS详情
    目录简介链接LinksURI templatesLink relationsRepresentation models总结简介 SpringBoot提供了HATEOAS的便捷使用方式...
    99+
    2024-04-02
  • 在SpringBoot中使用HATEOAS的方法
    目录简介文章目标构建Entity和Repository构建HATEOAS相关的RepresentationModel构建ControllerHATEOAS的意义简介 HATEOAS是...
    99+
    2024-04-02
  • SpringBoot中使用Thymeleaf模板详情
    目录一.什么是Thymeleaf二.SpringBoot中使用Thymeleaf模板1.pom.xml中添加thymeleaf依赖2.关闭thymeleaf缓存3.创建thymele...
    99+
    2024-04-02
  • Java之SpringBoot-Thymeleaf详情
    目录1、About Thymeleaf2、Hello Thymeleaf3、Thymeleaf 表达式3.1配置文件声明3.2 常用表达式3.2.1 0x01 ${} 变量...
    99+
    2024-04-02
  • SpringBoot Mail邮件任务详情
    目录一、引言二、简单使用1、pom包配置2、在application.properties中添加邮箱配置3、编写mailService,这里只提出实现类。4、编写test类进行测试三...
    99+
    2024-04-02
  • springboot整合mybatisplus与druid详情
    加坐标可以使用https://mvnrepository.com/来查找 先加以下坐标: 使用的数据库介绍: 配置连接数据库: spring: datasource: ...
    99+
    2024-04-02
  • springboot 整合 dubbo 的实现组聚合详情
    目录消费者自定义聚合策略如何自定义 dubbo 聚合策略?提供者接口及其实现表结构及数据消费者 yml 文件配置: dubbo: application: name: d...
    99+
    2024-04-02
  • Android中的LaunchMode详情
    目录一. 多任务和Task、启动模式二. 四种启动模式详解1. Standard2. SingleTask3. SingleTop4.SingleInstance三. Task...
    99+
    2022-06-07
    Android
  • SpringBoot+ShardingSphereJDBC实现读写分离详情
    目录1 概述2 环境3 一些基础理论3.1 读写分离3.2 主从复制3.3 数据库中间件简介4MySQL主从复制环境准备4.1 主库操作4.1.1 拉取镜像并创建容器运行4.1.2 ...
    99+
    2022-11-13
    SpringBoot读写分离 ShardingSphereJDBC读写分离
  • Springboot-Shiro基本使用详情介绍
    目录一、依据官网快速搭建Quickstart1.1 配置pom.xml依赖1.2配置log4j.properties1.3 配置shiro.ini1.4启动类二、springboot...
    99+
    2024-04-02
  • Springboot实现多数据源切换详情
    目录1. 实现效果1.1 controller1.2 mybatis.xml1.3 application.yml1.4 启动类2. 注解2.1 @Router3. 分库策略3.1 ...
    99+
    2024-04-02
  • SpringBoot+thymeleaf+ajax实现局部刷新详情
    目录前言什么是局部刷新?优势和弊端?实现流程案列 前言 什么是局部刷新? 简而言之,就是当我发送一个请求到后端后拿到数据后返回当前 页面不会对整个页面进行重载而只对当前请求的模块进行...
    99+
    2024-04-02
  • Java中的继承详情
    目录一. 继承1.1 继承的实现1.2 继承的好处和弊端二. 继承中的成员访问特点2.1 继承中变量的访问特点2.2 super2.3 继承中构造方法的访问特点2.4 继承中成员方法...
    99+
    2024-04-02
  • C++中的数组详情
    目录1、数组2、数组的使用2.1 元素访问2.2 初始化3、C++11 的初始化方式1、数组 数组其实也是一种数据格式,不过是一种复合类型,它可以存储多个同类型的值。 使用数组可以将...
    99+
    2024-04-02
  • Java 中的 File类详情
    目录一、File类简单介绍二、 路径的分类三、 构造方法四、 成员方法一、File类简单介绍 为什么要学习File类呢,他的作用又是什么呢? IO流操作中大部分都是对文件进行...
    99+
    2024-04-02
  • Redis中HyperLogLog的使用详情
    目录前言添加元素前言 HyperlogLog ,基数统计; 那什么是基数? 比如有两个数组 数组A = [1,2,3,4,5]; 数组B = [3,4,5,6,7]; 这时候基数就是 [1,2,3,4...
    99+
    2024-04-02
  • Python中的for循环详情
    目录1、可迭代对象1.1什么是可迭代对象1.2怎么判断2、字符串的for循环3、列表的for循环4、元组的for循环5、字典的for循环5.1keys()5.2 values()5....
    99+
    2024-04-02
  • C#中的Explicit和Implicit详情
    目录 一、Implicit和Explicit1、Implicit2、、Explicit先上一段奇怪的代码: if (dto.Payment == null) conti...
    99+
    2024-04-02
  • python中的元类metaclass详情
    目录动机从一个问题引出 MetaClassMetaclass 编程动机 python语言因为工作偏向于 AI ,所以对于这门语言还停留在表面,对于 python 深层并没有接触到。 ...
    99+
    2024-04-02
  • Python中的 enumerate和zip详情
    目录前言1. enumerate 方法2. zip 方法总结前言 我们在上一期学习了关于Python 迭代器Iterator详情相关的概念,满足迭代器需要符合两个条件 实现...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作