SpringBootHATEOASAuthority预定义了一些relations获取的属性

目录

简介

SpringBoot 提供了一种使用 HATEOAS 的便捷方式。在上一篇文章中,我们也谈到了如何在 SpringBoot 中使用 HATEOAS。本文将在这些内容上展开,详细讲解SpringBoot提供的基本方法。

链接

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

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

让我们看一个 HTML 中的链接标签示例:




可以看到一个链接有两个比较重要的属性,一个是href代表链接的链接,另一个是当前文档和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 模板

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

所以链接也可以通过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 values = new HashMap();
values.put("segment", "path");
values.put("parameter", 42);
assertThat(link.expand(values).getHref()) 
    .isEqualTo("/path/something?parameter=42");

上例中,通过string构造了一个链接,然后调用expand传入参数对应的map,构造出真正的href值。

除了直接使用字符串,还可以传入UriTemplate:

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

链接关系

图片[1]-SpringBootHATEOASAuthority预定义了一些relations获取的属性-唐朝资源网

链接关系是指链接中的 ref 属性。表示当前文档和链接文档之间的关系。 Spring HATEOAS 中有一个 LinkRelation 类来表示它。

IANA(Internet Assigned Numbers Authority)预定义了一些关系,可以通过IanaLinkRelations类获取,如下:

Link link = Link.of("/some-resource"), IanaLinkRelations.NEXT);
assertThat(link.getRel()).isEqualTo(LinkRelation.of("next"));
assertThat(IanaLinkRelation.isIanaRel(link.getRel())).isTrue();

表示模型

我们需要访问的是每个资源,然后我们需要为每个资源添加链接。 Spring HATEOAS 为我们提供了一个名为 RepresentationModel 的简单类。它包含链接和一些方便的方法来帮助我们创建链接资源。

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

public class BookModel extends RepresentationModel {
    private final Book content;
}

图片[2]-SpringBootHATEOASAuthority预定义了一些relations获取的属性-唐朝资源网

我们使用 add 方法为其添加链接:

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

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

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

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

对于集合,可以使用 CollectionModel:

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

总结

链接、URI 模板、链接关系和 RepresentationModel 解释于

是Spring HATEOAS的基础,掌握了就基本掌握了Spring HATEOAS。

更多信息请参考

最流行的解读,最深刻的干货,最简洁的教程,还有很多你不知道的小技巧等你来发现!

© 版权声明
THE END
喜欢就支持一下吧
点赞132赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容