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

标签:SpringBoot,HATEOAS
0
投稿

猜你喜欢

  • Android Notification使用方法详解

    2023-12-14 13:03:17
  • Android Studio实现简单计算器功能

    2023-10-17 03:54:42
  • Java使用Graphics2D绘制SVG和PNG的方法

    2021-11-13 01:03:51
  • 浅谈MyBatis中@MapKey的妙用

    2023-09-25 10:42:02
  • 深入理解Android Bitmap

    2023-07-29 08:52:14
  • 浅谈JVM内存溢出原因和解决思路

    2023-11-23 12:24:15
  • android中SwipeRefresh实现各种上拉,下拉刷新示例

    2022-06-14 17:18:03
  • C#实现简单的JSON序列化功能代码实例

    2023-06-21 09:03:52
  • C# Math中常用数学运算的示例详解

    2023-10-06 23:06:28
  • c#使用win32api实现获取光标位置

    2022-05-09 10:59:33
  • C#读取或设置ScrollLock状态的方法

    2023-03-14 21:41:24
  • 详解MyBatis-Puls中saveBatch批量添加慢的问题

    2021-10-14 02:36:27
  • Java实现简单LRU缓存机制的方法

    2023-08-11 03:54:49
  • C++实现无重复字符的最长子串

    2023-11-02 22:49:00
  • Flutter加载图片流程之ImageCache源码示例解析

    2023-07-04 01:56:23
  • java仿windows记事本小程序

    2023-11-25 09:24:43
  • 浅谈Java中实现深拷贝的两种方式—clone() & Serialized

    2022-04-05 18:36:15
  • Flutter开发技巧ListView去除水波纹方法示例

    2021-12-27 14:15:24
  • SpringBoot中shiro过滤器的重写与配置详解

    2021-07-28 23:40:09
  • android跑马灯出现重复跳动以及不滚动问题的解决方法

    2023-07-24 00:33:48
  • asp之家 软件编程 m.aspxhome.com