帽子
HATEOAS是Hypermedia(应用程序状态引擎)的首字母缩写。超级媒体一词是指包含指向其他形式的媒体(如图像, 电影和文本)的链接的内容。它是REST应用程序的一个组件, 可将其与其他网络体系结构区分开。客户端使用HATEOAS与网络应用程序进行交互, 该网络应用程序的应用程序服务器通过Hypermedia动态提供信息。
春季HATEOAS
Spring-HATEOAS是API的库。在使用Spring MVC时, 我们可以使用这些API创建遵循HATEOAS原理的REST表示形式。
在Spring HATEOAS项目中, 我们不需要Servlet Context并将路径变量连接到基本URI。取而代之的是, Spring HATEOAS提供了三种用于创建URI的抽象:ContrrollerLinkBuilder, 链接和资源支持。我们可以使用这些抽象来创建与资源表示相关联的元数据。
特征
- 它支持HAL之类的超媒体格式。
- 它提供了链接构建器API来创建指向MVC控制器方法的链接。
- 链接的模型类, 资源表示模型。
Spring Boot执行以下任务:
- 配置HAL支持
- 注册对实体链接的支持
- 连接消息转换器支持
假设我们已请求localhost:8080 / users / 1的GET请求, 它返回用户ID 1的详细信息。与此同时, 它还返回一个名为link的字段, 其中包含所有链接(localhost:8080 / users)用户, 以便消费者可以检索所有用户。这个概念称为HATEOAS。
让我们在项目中实现HATEOAS。
步骤1:打开pom.xml并添加spring-boot-starter-hateoas依赖项。
<dependency>d
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>
第2步:打开UserResource.java并复制retrieveUser()方法。
步骤3:粘贴方法并进行以下更改:
- 创建Resource类的构造函数。
Resource<User> resource = new Resource<User>(User)
请记住, 导入org.springframework.hateoas包的Resource类。
- 通过使用ControllerLinkBuilder类添加一个链接以检索所有用户。它使我们能够从方法创建链接。
- 导入ControllerLinkBuilder。
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.
- 使用ControllerLinkBuilder类的方法linkTo()。它创建了一个新的ControllerLinkBuilder, 其基础是注释到给定控制器类的映射。
ControllerLinkBuilder linkTo=linkTo(methodOn(this.getClass().retrieveAllUsers());
methodOn()是DummyInvocationUtils.methodOn(class, Object)的包装, 以防你使用ControllerLinkBuilder的静态导入工作。
- 将此链接添加到具有我们要在HATEOAS中使用的名称的资源。
resource.add(linkTo.withRel("all-users"));
withRel(String rel)是使用给定的rel创建由当前构建器实例构建的链接的方法。参数rel不能为null。
- 返回资源而不是用户。
- 将方法的返回类型更改为Resource。
进行上述更改后, UserResource.java文件如下所示:
UserResource.java
package com.srcmini.server.main.user;
import static org.springframework.hateoas.mvc.ControllerLinkBuilder.*;
import java.net.URI;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.hateoas.Resource;
import org.springframework.hateoas.mvc.ControllerLinkBuilder;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
@RestController
public class UserResource
{
@Autowired
private UserDaoService service;
@GetMapping("/users")
public List<User> retriveAllUsers()
{
return service.findAll();
}
@GetMapping("/users/{id}")
public Resource<User> retriveUser(@PathVariable int id)
{
User user= service.findOne(id);
if(user==null)
//runtime exception
throw new UserNotFoundException("id: "+ id);
//"all-users", SERVER_PATH + "/users"
//retrieveAllUsers
Resource<User> resource=new Resource<User>(user); //constructor of Resource class
//add link to retrieve all the users
ControllerLinkBuilder linkTo=linkTo(methodOn(this.getClass()).retriveAllUsers());
resource.add(linkTo.withRel("all-users"));
return resource;
}
//method that delete a user resource
@DeleteMapping("/users/{id}")
public void deleteUser(@PathVariable int id)
{
User user= service.deleteById(id);
if(user==null)
//runtime exception
throw new UserNotFoundException("id: "+ id);
}
//method that posts a new user detail and returns the status of the user resource
@PostMapping("/users")
public ResponseEntity<Object> createUser(@Valid @RequestBody User user)
{
User sevedUser=service.save(user);
URI location=ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(sevedUser.getId()).toUri();
return ResponseEntity.created(location).build();
}
}
步骤4:打开REST客户端Postman并发送GET请求。
在这里, 我们可以看到它返回了用户以及用于访问所有用户的链接。现在, 单击链接, 然后再次发送GET请求。它返回所有用户的列表, 如下图所示。
评论前必须登录!
注册