网易首页 > 网易号 > 正文 申请入驻

SpringBoot之:SpringBoot中使用HATEOAS

0
分享至

简介

HATEOAS是实现REST规范的一种原则,通过遵循HATEOAS规范,可以解决我们实际代码实现的各种个问题。作为java最流行的框架Spring
当然也会不缺席HATEOAS的集成。

本文将会通过一个具体的例子来讲解如何在SpringBoot中使用HATEOAS。

我们的目标

HATEOAS规则中,返回的数据会带有链接。我们以熟悉的Book为例,来展示这次的HATEOAS,首先创建一个Book entity:

@Data
@Entity
public class Book {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
}

我们希望能够通过下面的链接来获取到Book的详细数据:

GET /book/1

返回的数据如下:


"content": {
"id": 1,
"title": "The Hobbit"
},
"_links": {
"self": {
"href": "http://localhost:8080/book/1"

可以看到在返回的数据中除了content包含了book的信息之外,还有一个_links属性,表示和该Book相关的资源链接。

构建Entity和Repository

在做任何数据之前,我们都需要构建相应的数据,也就是entity和对应的数据操作,为了简便起见,我们使用H2的内存数据库。

我们需要在application.properties中配置如下:

spring.jpa.hibernate.ddl-auto=validate

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

然后配置对应的repository :

public interface BookRepository extends CrudRepository {
long deleteByTitle(String title);

@Modifying
@Query("delete from Book b where b.title=:title")
void deleteBooks(@Param("title") String title);
}

同时,需要在resources中放置创建table的schema.sql和插入数据的data.sql。这样在程序启动的时候就可以自动创建相应的数据。

构建HATEOAS相关的RepresentationModel

如果要让自己来实现,也可以实现添加链接的操作,但是这样就太复杂了,还好我们有Spring。要在Spring中使用HATEOAS,需要进行如下配置:


org.springframework.boot
spring-boot-starter-hateoas

如果我们想要对Book进行HATEOAS的构建,那么可以构建一个类,继承RepresentationModel即可:

public class BookModel extends RepresentationModel {

private final Book content;

@JsonCreator
public BookModel(@JsonProperty("content") Book content) {
this.content = content;
}

public Book getContent() {
return content;
}
}

上面的例子中,我们用RepresentationModel封装了一个Book对象,并将其设置为json的content属性。

构建Controller

有了RepresentationModel,我们就可以使用它来构建HATEOAS的响应了。

我们看下面的例子:

@RequestMapping("/book/{id}")
public HttpEntity getBook(@PathVariable("id") Long id) {
Book book= bookRepository.findById(id).get();
BookModel bookModel = new BookModel(book);
bookModel.add(linkTo(methodOn(BookController.class).getBook(id)).withSelfRel());
return new ResponseEntity(bookModel, HttpStatus.OK);

上面的例子中,我们使用@RequestMapping来构建了一个HTTP请求,通过传入book的id来从数据库中查找相应的Book数据。

然后将其传入BookModel中,构建好RepresentationModel。这时候可以直接返回这个对象。但是我们还需要向其添加一些links。

我们使用bookModel.add来添加相应的link。并且使用linkTo方法来生成相应的link。

最后将RepresentationModel返回。

当我们请求/book/1的时候,就会得到最前面我们想要得到的json值。使用HATEOAS是不是很简单?

HATEOAS的意义

HATEOAS带有相应的资源链接,通过一个资源就可以得到从这个资源可以访问的其他的资源,就像是一个访问到一个页面,可以再通过这个页面去访问其他的页面一样。

所以HATEOAS的意义就在于我们只需要访问一个资源就可以遍历所有的资源。

我们通过测试来体验一下资源的访问。

首先,我们直接访问/book/1这个资源,来确认下得到的结果:

@Test
void envEndpointNotHidden() throws Exception {
mockMvc.perform(get("/book/1"))
.andExpect(jsonPath("$.content.title").value("The Hobbit"));

然后再通过Spring HATEOAS提供的Traverson类来进行链接的遍历:

@Test
void envEndpointNotHidden() throws Exception {
Traverson traverson = new Traverson(new URI("http://localhost:" + this.port + "/book/1"), MediaTypes.HAL_JSON);
String bookTitle = traverson.follow("self").toObject("$.content.title");
assertThat(bookTitle).isEqualTo("The Hobbit");
总结

很好,我们已经可以使用基本的HATEOAS了。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
张学友缺席胡枫九五至尊演唱会最后大合唱,是不是因为刘德华…

张学友缺席胡枫九五至尊演唱会最后大合唱,是不是因为刘德华…

慧翔百科
2026-06-09 08:10:20
马斯克39页SpaceX计划,人类史上最伟大的PPT

马斯克39页SpaceX计划,人类史上最伟大的PPT

量子位
2026-06-07 20:11:45
煤层厚达1千米,绵延上千公里!世界最大煤田真的是植物形成的?

煤层厚达1千米,绵延上千公里!世界最大煤田真的是植物形成的?

离离言几许
2026-06-08 18:21:06
空心菜再次被点名!研究发现:吃得越多,关节炎患者病情或好转

空心菜再次被点名!研究发现:吃得越多,关节炎患者病情或好转

健康科普365
2026-06-08 21:05:07
73岁黎晓宏落马,中共中央批准:开除三虎党籍!齐扎拉贪腐1.58亿判无期

73岁黎晓宏落马,中共中央批准:开除三虎党籍!齐扎拉贪腐1.58亿判无期

上观新闻
2026-06-08 12:28:40
原来他就是奚梦瑶前男友,曾是全球身价最高男模,如今36岁仍单身

原来他就是奚梦瑶前男友,曾是全球身价最高男模,如今36岁仍单身

不似少年游
2026-06-05 09:43:01
苏州网友投诉高考期间有人深夜“骑车炸街”,交警:事发区域不禁摩,凌晨3点仍在驱离

苏州网友投诉高考期间有人深夜“骑车炸街”,交警:事发区域不禁摩,凌晨3点仍在驱离

极目新闻
2026-06-08 18:13:48
纽约市长邀文班亚马出席听证会 时间恰好撞车总决赛G4

纽约市长邀文班亚马出席听证会 时间恰好撞车总决赛G4

元气满分吖
2026-06-09 08:17:20
郑钦文首轮游背景显落寞!世排跌158遭伤病困扰 本赛季还需保75分

郑钦文首轮游背景显落寞!世排跌158遭伤病困扰 本赛季还需保75分

颜小白的篮球梦
2026-06-09 09:05:25
记者:迈阿密与胖虎达成初步协议,但需先向洛杉矶银河付补偿

记者:迈阿密与胖虎达成初步协议,但需先向洛杉矶银河付补偿

懂球帝
2026-06-09 01:17:15
高考大局已定:若不出意外,2026年中国高考录取,或将迎3大变化

高考大局已定:若不出意外,2026年中国高考录取,或将迎3大变化

近史博览
2026-06-09 04:26:43
一周内两次主动低头,巴方求见: 港口快黄了!中方懒得给好脸色

一周内两次主动低头,巴方求见: 港口快黄了!中方懒得给好脸色

锅锅爱历史
2026-06-08 11:44:48
圣彼得堡经济论坛最尴尬一幕:管钱的人没来,讲核武的人来了

圣彼得堡经济论坛最尴尬一幕:管钱的人没来,讲核武的人来了

桂系007
2026-06-08 20:14:53
今年赢过尼克斯!Shams:老鹰和主帅斯奈德达成多年续约合同

今年赢过尼克斯!Shams:老鹰和主帅斯奈德达成多年续约合同

懂球帝
2026-06-08 23:17:02
到了美国,这回知道自己的份量了吧?

到了美国,这回知道自己的份量了吧?

果妈聊娱乐
2026-06-08 08:05:28
援助反被咬一口?菲律宾民众慌了,未来灾难该指望谁?

援助反被咬一口?菲律宾民众慌了,未来灾难该指望谁?

吃货的分享
2026-06-09 07:32:06
调查发现:血管最怕的早餐,肉包子第五,第一名很多人天天都在吃

调查发现:血管最怕的早餐,肉包子第五,第一名很多人天天都在吃

路医生健康科普
2026-06-08 16:21:39
曼联已接洽M费,球员渴望加盟且周薪合理!西汉姆要价升至8500万

曼联已接洽M费,球员渴望加盟且周薪合理!西汉姆要价升至8500万

罗米的曼联博客
2026-06-09 07:11:13
以色列报复性空袭德黑兰,伊朗革命卫队司令传出死讯

以色列报复性空袭德黑兰,伊朗革命卫队司令传出死讯

桂系007
2026-06-08 19:47:22
美军袭击驶向伊朗港口的油轮

美军袭击驶向伊朗港口的油轮

闪电新闻
2026-06-09 09:10:00
2026-06-09 09:51:00
flydean程序那些事
flydean程序那些事
最通俗的解读,最深刻的干货!
356文章数 438关注度
往期回顾 全部

科技要闻

一文看懂苹果WWDC26:库克告别,Siri重生

头条要闻

日媒称高市早苗的孙子在中国留学 日本极右翼集体破防

头条要闻

日媒称高市早苗的孙子在中国留学 日本极右翼集体破防

体育要闻

2026年世界杯?到底会是什么样?

娱乐要闻

越扒越有!奔跑吧文旅合作费近两千万

财经要闻

俞浩深陷争议 百亿追觅谁来托底?

汽车要闻

从真实事故场景出发 吉利银河星舰7 EV硬核安全“超纲”了

态度原创

家居
教育
健康
旅游
艺术

家居要闻

自由流光 回溯生活真意

教育要闻

比高考更能改变命运的,是什么?

干细胞新规落地,打干细胞更容易还是更难了?

旅游要闻

文化遗产耀中原|“北宋名相韩琦的纪念圣地”——安阳韩王庙与昼锦堂

艺术要闻

定了!深圳最大高铁站,超130亿元!

无障碍浏览 进入关怀版