
Рой Томас Филдинг сказал, что уровень 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;
}