🔗
Advanced REST Patterns

HATEOAS & HAL

Hypermedia-Driven APIs
💡 HATEOAS, EK "CHOOSE YOUR OWN ADVENTURE" BOOK jaisa hai — HAR PAGE (RESPONSE), TUMHE, BATATA hai, "AGE, KYA-KYA KAR SAKTE HO" (AVAILABLE ACTIONS/LINKS) — TUMHE, KHUD SE, GUESS NAHI KARNA PADТA, KI, AGLA STEP, KYA hai.

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, EK "CHOOSE YOUR OWN ADVENTURE" BOOK jaisa hai — HAR PAGE (RESPONSE), TUMHE, BATATA hai, "AGE, KYA-KYA KAR SAKTE HO" (AVAILABLE ACTIONS/LINKS) — TUMHE, KHUD SE, GUESS NAHI KARNA PADТA, KI, AGLA STEP, KYA hai.
1 / 6
⚡ Quick Recap
  • 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
Is page mein (2 subtopics)

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.

💡Tip: HAL-FORMS, RARE hai, PRACTICALLY — MOST, TEAMS, SIRF, BASIC, HAL (_links) tak, HI, RUKТE hain.

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());