写点什么

SpringBoot 之:SpringBoot 的 HATEOAS 基础

作者:程序那些事
  • 2022 年 5 月 15 日
  • 本文字数:2031 字

    阅读完需:约 7 分钟

SpringBoot之:SpringBoot的HATEOAS基础

简介

SpringBoot 提供了 HATEOAS 的便捷使用方式,前面一篇文章我们也讲了如何在 SpringBoot 中使用 HATEOAS。本文将会对这些内容进行扩展深入,详细讲解 SpringBoot 提供的这些基本方法。

链接 Links

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


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


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


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


更多内容请参考 http://www.flydean.com/00043-springboot-hateoas-fundamentals/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

发布于: 21 小时前阅读数: 19
用户头像

关注公众号:程序那些事,更多精彩等着你! 2020.06.07 加入

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧,尽在公众号:程序那些事!

评论

发布
暂无评论
SpringBoot之:SpringBoot的HATEOAS基础_Java_程序那些事_InfoQ写作社区