为RESTful服务实现HATEOAS

帽子 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包的Res??ource类。
  • 通过使用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; @RestControllerpublic class UserResource {@Autowiredprivate 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 exceptionthrow new UserNotFoundException("id: "+ id); //"all-users", SERVER_PATH + "/users"//retrieveAllUsersResource< User> resource=new Resource< User> (user); //constructor of Resource class//add link to retrieve all the usersControllerLinkBuilder 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 exceptionthrow 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请求。
为RESTful服务实现HATEOAS

文章图片
【为RESTful服务实现HATEOAS】在这里, 我们可以看到它返回了用户以及用于访问所有用户的链接。现在, 单击链接, 然后再次发送GET请求。它返回所有用户的列表, 如下图所示。
为RESTful服务实现HATEOAS

文章图片

    推荐阅读