HATEOAS & HAL
HATEOAS (Hypermedia As The Engine Of Application State), REST ki, "TRUE" DEFINITION ka, EK CORE PART hai — RESPONSE mein, SIRF, DATA HI NAHI, BALKI, "AGE, KYA POSSIBLE hai" ke, LINKS bhi, INCLUDED hote hain — CLIENT, HARDCODED URLs PAR, DEPEND NAHI karta.
HAL (Hypertext Application Language), EK COMMON, JSON-BASED FORMAT hai, HATEOAS LINKS ko, REPRESENT karne ke liye — _links KEY ke ANDAR, RELATED RESOURCES ke, LINKS, STRUCTURED WAY mein, DIYE JAATE hain. Spring HATEOAS library, ISI FORMAT ko, EASILY, GENERATE karne mein, HELP karti hai.
@GetMapping("/{id}")
public EntityModel<OrderDto> getOrder(@PathVariable Long id) {
Order order = orderService.findById(id);
EntityModel<OrderDto> model = EntityModel.of(toDto(order));
model.add(linkTo(methodOn(OrderController.class).getOrder(id)).withSelfRel());
if (order.getStatus() == OrderStatus.PENDING) {
model.add(linkTo(methodOn(OrderController.class).cancelOrder(id)).withRel("cancel"));
model.add(linkTo(methodOn(OrderController.class).payOrder(id)).withRel("pay"));
}
return model;
}
// Response:
// {
// "id": 42, "status": "PENDING",
// "_links": {
// "self": { "href": "/api/orders/42" },
// "cancel": { "href": "/api/orders/42/cancel" },
// "pay": { "href": "/api/orders/42/pay" }
// }
// }- HATEOAS = response mein, "kya possible hai" ke links, INCLUDED hote hain
- HAL format = _links key, JSON-based, standard structure
- Conditional links = business rules, LINKS ki PRESENCE/ABSENCE se, EXPRESS hote hain
HAL-FORMS, HAL ka, EK, EXTENSION hai — SIRF, LINKS, NAHI, BALKI, "YE, ACTION, PERFORM karne ke liye, KYA, DATA, CHAHIYE" (jaise, FORM FIELDS), YE bhi, RESPONSE mein, DESCRIBE karta hai — CLIENT, DYNAMICALLY, FORMS, BANA sakta hai, RESPONSE SE.
CollectionModel<EntityModel<T>>, EK, LIST of, RESOURCES ko, REPRESENT karta hai, JAHA, HAR, INDIVIDUAL, ITEM ka, APNA, _links hai, aur, POORI, COLLECTION ka, bhi (jaise, PAGINATION LINKS).
CollectionModel<EntityModel<ProductDto>> collection = CollectionModel.of(
products.stream().map(this::toModel).toList(),
linkTo(methodOn(ProductController.class).getAllProducts()).withSelfRel());