📜  为RESTful服务实现HATEOAS

📅  最后修改于: 2021-01-12 00:51:09             🧑  作者: Mango

为RESTful服务实现HATEOAS

帽子

HATEOAS首字母缩略词,表示“超媒体”是应用程序状态的引擎。术语“超媒体”是指包含指向其他形式的媒体(如图像,电影和文本)的链接的内容。它是REST应用程序的一个组件,可将其与其他网络体系结构区分开。客户端使用HATEOAS与网络应用程序进行交互,该网络应用程序的应用程序服务器通过Hypermedia动态提供信息。

春季HATEOAS

Spring-HATEOAS是API的库。在使用Spring MVC时,我们可以使用这些API创建遵循HATEOAS原理的REST表示。

在Spring HATEOAS项目中,我们不需要Servlet Context并将路径变量连接到基本URI。取而代之的是,Spring HATEOAS提供了三种用于创建URI的抽象: ContrrollerLinkBuilder,LinkResource Support 。我们可以使用这些抽象来创建与资源表示关联的元数据。

特征

  • 它支持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依赖项。

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

第2步:打开UserResource.java并复制retrieveUser()方法。

步骤3:粘贴方法并进行以下更改:

  • 创建Resource类的构造函数。
Resource resource = new Resource(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.javatpoint.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 retriveAllUsers()
{
return service.findAll();
}
@GetMapping("/users/{id}")
public Resource 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 resource=new Resource(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 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请求。它返回所有用户的列表,如下图所示。