Bird
Raised Fist0
Rest APIprogramming~10 mins

HAL format overview in Rest API - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - HAL format overview
Client sends HTTP request
Server processes request
Server builds HAL response
Add _links
Send HAL JSON response
Client parses HAL response
The client sends a request, the server builds a HAL JSON response with _links and _embedded sections, then sends it back for the client to parse.
Execution Sample
Rest API
{
  "_links": {
    "self": { "href": "/orders/123" }
  },
  "total": 30
}
This is a simple HAL response showing a self link and a total value.
Execution Table
StepActionData AddedResulting JSON Part
1Start building responseNone{}
2Add _links section"self": {"href": "/orders/123"}{"_links": {"self": {"href": "/orders/123"}}}
3Add property total"total": 30{"_links": {"self": {"href": "/orders/123"}}, "total": 30}
4Send responseComplete HAL JSONFull HAL JSON sent to client
💡 Response sent; client can now parse HAL JSON with _links and properties
Variable Tracker
VariableStartAfter Step 2After Step 3Final
response{}{"_links": {"self": {"href": "/orders/123"}}}{"_links": {"self": {"href": "/orders/123"}}, "total": 30}Sent to client
Key Moments - 2 Insights
Why do we use the _links section in HAL?
The _links section provides URLs to related resources, helping clients navigate the API easily, as shown in step 2 of the execution_table.
What is the purpose of the _embedded section in HAL?
The _embedded section includes related resource data directly inside the response, reducing extra requests. It is not shown in this simple example but is similar to _links in structure.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 2, what key is added to the response?
A"_embedded"
B"_links"
C"total"
D"self"
💡 Hint
Check the 'Data Added' column at step 2 in execution_table
At which step is the 'total' property added to the response?
AStep 1
BStep 2
CStep 3
DStep 4
💡 Hint
Look at the 'Action' column in execution_table for when 'total' is added
If the server adds an _embedded section, where would it appear in the response building flow?
AAlongside _links before sending response
BBefore adding _links
CAfter sending response
DAfter adding total property
💡 Hint
Refer to concept_flow where _links and _embedded are added before sending response
Concept Snapshot
HAL format builds JSON responses with special sections:
_links: URLs to related resources
_embedded: nested related resource data
Properties: main data fields
Client uses these to navigate and understand API easily.
Full Transcript
HAL format is a way to structure JSON responses in REST APIs. The server builds a response including a _links section with URLs to related resources and optionally an _embedded section with nested data. Properties hold main data values. The client sends a request, the server builds this HAL JSON, and sends it back. This helps clients navigate APIs easily by following links and accessing embedded data without extra requests.

Practice

(1/5)
1. What is the main purpose of the _links section in a HAL formatted REST API response?
easy
A. To define the API version number
B. To store user authentication tokens
C. To list all data fields in the response
D. To provide URLs to related resources for easy navigation

Solution

  1. Step 1: Understand the role of _links in HAL

    The _links section contains URLs pointing to related resources, helping clients navigate the API easily.
  2. Step 2: Compare options with HAL purpose

    Options B, C, and D do not describe navigation or linking related resources, which is the key feature of _links.
  3. Final Answer:

    To provide URLs to related resources for easy navigation -> Option D
  4. Quick Check:

    HAL _links = URLs for related resources [OK]
Hint: Remember: _links always holds related resource URLs [OK]
Common Mistakes:
  • Confusing _links with data fields
  • Thinking _links stores authentication info
  • Assuming _links defines API version
2. Which of the following is the correct way to represent a link to a 'self' resource in HAL JSON?
easy
A. "_links": { "self": { "href": "/orders/123" } }
B. "links": { "self": "/orders/123" }
C. "_links": { "self": "/orders/123" }
D. "_link": { "href": "/orders/123" }

Solution

  1. Step 1: Recall HAL syntax for links

    HAL requires a _links object with named links, each having an href property.
  2. Step 2: Check each option's structure

    "_links": { "self": { "href": "/orders/123" } } correctly uses _links with self containing an object with href. Others miss underscores, use wrong keys, or omit href.
  3. Final Answer:

    "_links": { "self": { "href": "/orders/123" } } -> Option A
  4. Quick Check:

    HAL link = _links + href [OK]
Hint: HAL links always use _links and href keys [OK]
Common Mistakes:
  • Omitting underscore in _links
  • Using string instead of object for link value
  • Missing href property inside link
3. Given the following HAL JSON snippet, what is the URL to access the customer's details?
{
  "_links": {
    "self": { "href": "/orders/123" },
    "customer": { "href": "/customers/456" }
  },
  "orderNumber": "123"
}
medium
A. /orders/123
B. /customers/456
C. /orders/456
D. /customers/123

Solution

  1. Step 1: Identify the customer link in _links

    The customer key has an href value of "/customers/456" which points to the customer's details URL.
  2. Step 2: Confirm other options

    self points to the order URL "/orders/123". Other options mix order and customer IDs incorrectly.
  3. Final Answer:

    /customers/456 -> Option B
  4. Quick Check:

    Customer link = _links.customer.href = /customers/456 [OK]
Hint: Look inside _links for the named resource URL [OK]
Common Mistakes:
  • Confusing self with customer link
  • Mixing order and customer IDs
  • Ignoring the href property
4. Identify the error in this HAL JSON snippet:
{
  "_links": {
    "self": "/orders/123",
    "items": [{ "href": "/items/1" }, { "href": "/items/2" }]
  }
}
medium
A. The JSON is correct as is
B. "items" should be a single object, not an array
C. "self" link should be an object with an "href" property
D. "_links" key should be "links" without underscore

Solution

  1. Step 1: Check the structure of the "self" link

    In HAL, each link must be an object with an href property. Here, "self" is a string, which is incorrect.
  2. Step 2: Verify other parts

    "items" is correctly an array of link objects. The _links key must have an underscore. So only "self" link is wrong.
  3. Final Answer:

    "self" link should be an object with an "href" property -> Option C
  4. Quick Check:

    HAL links = objects with href [OK]
Hint: All HAL links must be objects with href keys [OK]
Common Mistakes:
  • Using string instead of object for single links
  • Removing underscore from _links
  • Thinking arrays are not allowed for multiple links
5. You want to design a HAL response for a blog post that includes links to the author and comments. Which JSON structure correctly follows HAL format?
hard
A. { "title": "My Post", "_links": { "self": { "href": "/posts/1" }, "author": { "href": "/users/42" }, "comments": [ { "href": "/comments/100" }, { "href": "/comments/101" } ] } }
B. { "title": "My Post", "links": { "self": "/posts/1", "author": "/users/42", "comments": ["/comments/100", "/comments/101"] } }
C. { "title": "My Post", "_links": { "self": "/posts/1", "author": "/users/42", "comments": "/comments/100,/comments/101" } }
D. { "title": "My Post", "_link": { "self": { "href": "/posts/1" }, "author": { "href": "/users/42" }, "comments": [ { "href": "/comments/100" }, { "href": "/comments/101" } ] } }

Solution

  1. Step 1: Verify the _links key and link objects

    { "title": "My Post", "_links": { "self": { "href": "/posts/1" }, "author": { "href": "/users/42" }, "comments": [ { "href": "/comments/100" }, { "href": "/comments/101" } ] } } correctly uses _links with each link as an object containing href. Multiple comments are an array of link objects.
  2. Step 2: Check other options for errors

    { "title": "My Post", "links": { "self": "/posts/1", "author": "/users/42", "comments": ["/comments/100", "/comments/101"] } } uses "links" without underscore and strings instead of objects. { "title": "My Post", "_links": { "self": "/posts/1", "author": "/users/42", "comments": "/comments/100,/comments/101" } } uses strings instead of objects for links. { "title": "My Post", "_link": { "self": { "href": "/posts/1" }, "author": { "href": "/users/42" }, "comments": [ { "href": "/comments/100" }, { "href": "/comments/101" } ] } } uses incorrect key "_link" instead of "_links".
  3. Final Answer:

    Option A JSON structure correctly follows HAL format -> Option A
  4. Quick Check:

    HAL requires _links with objects having href [OK]
Hint: Use _links with objects and href for all links [OK]
Common Mistakes:
  • Missing underscore in _links
  • Using strings instead of objects for links
  • Wrong key name like _link