Рой Томас Филдинг сказал, что уровень 3 зрелости — это настоящий RestApi

Прежде чем мы начнем, я объясню, что Rest API уровня 3
Rest API уровня 3
должен предоставить все конечные точки службы API в форме гипертекстовой ссылки через URI, который является первой записью. point
иВся информация об идентификации ресурса API может быть идентифицирована через API

пример

json
{
    "id": 1,
    "name": "SeongGil",
    "_links": {
            "all-users": {
                  "href": "http://localhost:8080/users"
                     }
             }
}

Теперь давайте реализуем это с помощью HATEOAS.

Добавить зависимости

pom.xml
<!-- Hateoas -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-hateoas</artifactId>
    <version>2.6.4</version>
</dependency>

Всегда начинать с pom.xml

Начну с двух способов. найти всех пользователей и найти одного пользователя
я пропустил детали службы и картографа
Поскольку это не имеет значения

найти всех пользователей

UserController
@GetMapping("/users")
public Map<String, Object> retrieveAllUsers() {
Map<String, Object> rMap = new HashMap<>();
    List<User> users = service.findAll();
    rMap.put("rList", users);
return rMap;
}

В коде много ненужного контента, поэтому я написал его кратко
Если вам нужен мой исходный код, см. ниже

UserController
// original code
public class UserController {
    
    private UserDaoService service;
@Autowired
    public UserController(UserDaoService service) {
        this.service = service;
    }
    @GetMapping("/users")
    public List<User> retrieveAllUsers() {
        List<User> users = service.findAll();
        SimpleBeanPropertyFilter filter =                          
        SimpleBeanPropertyFilter.filterOutAllExcept("id", "name",  
                                "join_date");
        FilterProvider filters = new  
        SimpleFilterProvider().addFilter("UserInfo", filter);
        MappingJacksonValue mapping = new 
                     MappingJacksonValue(users);
        mapping.setFilters(filters);
        return users;
    }

С этого момента я буду применять HATEOAS
Точно так же я буду писать исходный код и опущенный код

UserController
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;
@GetMapping("/users/{id}")
    public EntityMode<User> retrieveOneUsers( @PathVariable int id) {
        User user = service.findOne(id);
        EntityModel<User> model = EntityModel.of(user);
WebMvcLinkBuilder linkTo =    
        linkTo(methodOn(this.getClass()).retrieveAllUsers());
        // get Endpoint of retrieveAllUsers
        model.add(linkTo.withRel("all-users"));
        // add Url
return model;
}

Мы можем вернуть конечную точку вместе вот так
Используйте статический импорт, чтобы упростить код

Наконец, я закончу исходным кодом

UserController
// original code
@GetMapping("/users/{id}")
    public MappingJacksonValue retrieveOneUsers(@PathVariable int id) {
        User user = service.findOne(id);
        EntityModel<User> model = EntityModel.of(user);
        WebMvcLinkBuilder linkTo = 
        linkTo(methodOn(this.getClass()).retrieveAllUsers());
        model.add(linkTo.withRel("all-users"));
        SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter
                .filterOutAllExcept("id", "name");
        FilterProvider filters = new 
              SimpleFilterProvider().addFilter("UserInfo", filter);
        MappingJacksonValue mapping = new 
        MappingJacksonValue(model);
        mapping.setFilters(filters);
        return mapping;
    }