启动超媒体(Enabling hypermedia)
作为应用程序状态引擎的超媒体( HATEOAS)是一种创建自描述API的方法,其中从API返回的资源包含指向相关资源的链接。这使客户能够在很少理解API的URL的情况下导航API。
Spring HATEOAS项目为Spring提供了超链接支持。它提供了一组类和资源组装器,可以在从Spring MVC控制器返回资源之前添加链接到资源。
启用超媒体,您需要将Spring HATEOAS启动器依赖项添加到构建中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>
这个启动器不仅将Spring HATEOAS添加到项目的类路径中,还提供了自动配置以启用Spring HATEOAS。您需要做的就是重新设计控制器以返回资源类型而不是领域类型。
@GetMapping("/recent")
public Resources<TacoResource> recentTacos() {
PageRequest page = PageRequest.of(0, 12, Sort.by("createAt").descending());
Iterable<Taco> items = tacoRepo.findAll();
List<Taco> tacos = new ArrayList<>();
for (Taco taco : items) {
tacos.add(taco);
}
//利用领域对象列表创建资源列表
List<TacoResource> tacoResources=new TacoResourceAssembler().toResources(tacos);
Resources<TacoResource> recentResources=new Resources<TacoResource>(tacoResources);
//包装领域对象
// Resources<Resource<Taco>> recentResources = Resources.wrap(tacos);
//将链接添加到资源中
recentResources.add(ControllerLinkBuilder.linkTo(methodOn(DesignTacoController.class).recentTacos()).withRel("recents"));
return recentResources;
}
package tacos.web.api;
import org.springframework.hateoas.mvc.ResourceAssemblerSupport;
import tacos.Taco;
//将领域类转换成资源类
public class TacoResourceAssembler extends ResourceAssemblerSupport<Taco,TacoResource> {
public TacoResourceAssembler(){
//DesignTacoController用于确定创建时创建的链接中任何URL的基本路径
super(DesignTacoController.class,TacoResource.class);
}
//仅实例化一个Resource对象
@Override
protected TacoResource instantiateResource(Taco taco){
return new TacoResource(taco);
}
//不仅要创造的Resource对象,还有链接来填充它
@Override
public TacoResource toResource(Taco taco) {
return createResourceWithId(taco.getId(),taco);
}
}
package tacos.web.api;
import lombok.Getter;
import org.springframework.hateoas.ResourceSupport;
import org.springframework.hateoas.core.Relation;
import tacos.Ingredient;
import tacos.Taco;
import java.util.Date;
import java.util.List;
//领域类Taco所对应的资源类型 TacoResource
//两个类的属性相同,但资源类型中不需要ID属性
@Relation(value = "taco",collectionRelation = "tacos")//设置资源类型生成Json的对象名称
public class TacoResource extends ResourceSupport {
private static final IngredientResourceAssembler ingredientAssembler=new IngredientResourceAssembler();
@Getter
private final String name;
@Getter
private final Date createAt;
@Getter
private final List<IngredientResource> ingredients;
public TacoResource(Taco taco){
this.name=taco.getName();
this.createAt=taco.getCreatedAt();
this.ingredients=ingredientAssembler.toResources(taco.getIngredients());
}
}
启用数据仓库支持的服务 Spring Data REST
它自动为Spring Data创建的存储库创建REST API
要开始使用Spring Data REST,请将以下依赖项添加到构建中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
为API设置一个基本路径,以使其端点不同,并且不会与您编写的任何控制器发生冲突
spring.data.rest.base-path=/api