Bird
Raised Fist0
Rest APIprogramming~30 mins

Composite operations (multi-resource) in Rest API - Mini Project: Build & Apply

Choose your learning style10 modes available
Composite Operations with Multiple Resources in REST API
📖 Scenario: You are building a simple REST API that manages a library system. The system has two resources: books and authors. Each book has a title and an author ID. Each author has a name.Sometimes, you want to perform multiple operations together, like adding a new author and then adding a book for that author in one go. This is called a composite operation.
🎯 Goal: Build a simple REST API that supports composite operations to create an author and a book together in one request.
📋 What You'll Learn
Create an in-memory data store for authors and books.
Add a configuration variable to track the next available ID for authors and books.
Implement a composite operation endpoint that creates an author and a book in one request.
Print the final state of authors and books after the composite operation.
💡 Why This Matters
🌍 Real World
Composite operations are common in real-world APIs where multiple related resources need to be created or updated together to keep data consistent.
💼 Career
Understanding composite operations helps in backend development, API design, and working with microservices where multiple resources interact.
Progress0 / 4 steps
1
DATA SETUP: Create in-memory data stores for authors and books
Create two empty dictionaries called authors and books to store authors and books respectively.
Rest API
Hint

Use empty curly braces {} to create empty dictionaries.

2
CONFIGURATION: Add ID counters for authors and books
Create two variables called next_author_id and next_book_id and set both to 1 to track the next available IDs.
Rest API
Hint

Use simple integer variables to keep track of IDs.

3
CORE LOGIC: Implement composite operation to add author and book
Write a function called add_author_and_book that takes author_name and book_title as parameters. Inside the function, use the global variables next_author_id and next_book_id. Add the author to authors with the next author ID, then add the book to books with the next book ID and link it to the author ID. Increment both ID counters by 1. Return a tuple with the new author ID and book ID.
Rest API
Hint

Remember to use global to modify the ID counters inside the function.

4
OUTPUT: Call the composite operation and print authors and books
Call add_author_and_book with "Jane Austen" as author_name and "Pride and Prejudice" as book_title. Then print the authors and books dictionaries.
Rest API
Hint

Call the function with the exact strings and then print both dictionaries.

Practice

(1/5)
1. What is the main benefit of using composite operations in REST APIs?
easy
A. They combine multiple API calls into a single request to save time and keep data consistent.
B. They allow you to write SQL queries inside REST endpoints.
C. They automatically generate API documentation.
D. They encrypt all API responses for security.

Solution

  1. Step 1: Understand what composite operations do

    Composite operations bundle several API calls into one request to reduce network overhead.
  2. Step 2: Identify the main benefit

    This bundling saves time and ensures related data changes happen together, keeping consistency.
  3. Final Answer:

    They combine multiple API calls into a single request to save time and keep data consistent. -> Option A
  4. Quick Check:

    Composite operations = combine calls + consistency [OK]
Hint: Composite means combining multiple calls into one [OK]
Common Mistakes:
  • Confusing composite operations with documentation tools
  • Thinking composite operations encrypt data
  • Assuming composite operations run SQL queries
2. Which of the following is the correct way to structure a composite operation request in JSON?
easy
A. [{"method": "DELETE", "path": "/items/1"}]
B. {"operation": "GET", "url": "/users"}
C. {"requests": {"method": "POST", "endpoint": "/orders"}}
D. {"operations": [{"method": "POST", "path": "/users"}, {"method": "PUT", "path": "/accounts/123"}]}

Solution

  1. Step 1: Identify the correct JSON structure for composite operations

    Composite operations usually use an "operations" array with each operation having "method" and "path" keys.
  2. Step 2: Compare options

    {"operations": [{"method": "POST", "path": "/users"}, {"method": "PUT", "path": "/accounts/123"}]} matches this structure exactly, while others use incorrect keys or formats.
  3. Final Answer:

    {"operations": [{"method": "POST", "path": "/users"}, {"method": "PUT", "path": "/accounts/123"}]} -> Option D
  4. Quick Check:

    Composite request = "operations" array with method and path [OK]
Hint: Look for "operations" array with method and path keys [OK]
Common Mistakes:
  • Using singular "operation" instead of plural "operations"
  • Using wrong keys like "url" or "endpoint"
  • Not wrapping operations inside an array
3. Given this composite operation request:
{
  "operations": [
    {"method": "POST", "path": "/users", "body": {"name": "Alice"}},
    {"method": "POST", "path": "/orders", "body": {"userId": "${1.id}", "item": "Book"}}
  ]
}
What is the expected behavior?
medium
A. Create a user named Alice, then create an order linked to that user using the new user ID.
B. Create an order first, then create a user named Alice.
C. Create a user named Alice only; the order creation will fail due to syntax error.
D. The request will fail because referencing previous operation results is not allowed.

Solution

  1. Step 1: Understand operation order and referencing

    The first operation creates a user named Alice. The second operation uses "${1.id}" to reference the ID from the first operation's result.
  2. Step 2: Determine expected behavior

    This means the order is created linked to the new user. This chaining is a key feature of composite operations.
  3. Final Answer:

    Create a user named Alice, then create an order linked to that user using the new user ID. -> Option A
  4. Quick Check:

    Reference previous result with ${1.id} = chained operations [OK]
Hint: Look for ${1.id} to see chaining between operations [OK]
Common Mistakes:
  • Assuming operations run in parallel without order
  • Thinking referencing previous results is invalid
  • Confusing operation indexes starting at 0 instead of 1
4. You have this composite operation request:
{
  "operations": [
    {"method": "POST", "path": "/products", "body": {"name": "Pen"}},
    {"method": "PUT", "path": "/inventory/${1.id}", "body": {"stock": 100}}
  ]
}
But the API returns an error saying "Invalid reference ${1.id}". What is the likely cause?
medium
A. The syntax for referencing previous results should be ${0.id}, not ${1.id}.
B. The first operation did not return an ID, so ${1.id} is invalid.
C. PUT method cannot be used in composite operations.
D. The inventory path should not include dynamic IDs.

Solution

  1. Step 1: Check the reference usage

    The error "Invalid reference ${1.id}" means the first operation's response does not contain an "id" field.
  2. Step 2: Understand why this causes error

    If the first operation's response lacks "id", the reference ${1.id} is invalid and causes failure.
  3. Final Answer:

    The first operation did not return an ID, so ${1.id} is invalid. -> Option B
  4. Quick Check:

    Reference error = missing id in first operation response [OK]
Hint: Check if referenced operation returns the expected field [OK]
Common Mistakes:
  • Assuming index starts at 0 instead of 1
  • Thinking PUT is disallowed in composite operations
  • Ignoring that referenced fields must exist in response
5. You want to create a composite operation that creates a customer, then creates two orders for that customer, and finally updates the customer's status to "active". Which JSON structure correctly represents this multi-resource composite operation?
hard
A. { "operations": [ {"method": "POST", "path": "/customers", "body": {"name": "Bob"}}, {"method": "POST", "path": "/orders", "body": {"customerId": "1", "item": "Laptop"}}, {"method": "POST", "path": "/orders", "body": {"customerId": "1", "item": "Mouse"}}, {"method": "PUT", "path": "/customers/1", "body": {"status": "active"}} ] }
B. { "operations": [ {"method": "POST", "path": "/orders", "body": {"item": "Laptop"}}, {"method": "POST", "path": "/customers", "body": {"name": "Bob"}}, {"method": "PUT", "path": "/customers/1", "body": {"status": "active"}} ] }
C. { "operations": [ {"method": "POST", "path": "/customers", "body": {"name": "Bob"}}, {"method": "POST", "path": "/orders", "body": {"customerId": "${1.id}", "item": "Laptop"}}, {"method": "POST", "path": "/orders", "body": {"customerId": "${1.id}", "item": "Mouse"}}, {"method": "PUT", "path": "/customers/${1.id}", "body": {"status": "active"}} ] }
D. { "operations": [ {"method": "POST", "path": "/customers", "body": {"name": "Bob"}}, {"method": "POST", "path": "/orders", "body": {"customerId": "${2.id}", "item": "Laptop"}}, {"method": "POST", "path": "/orders", "body": {"customerId": "${2.id}", "item": "Mouse"}}, {"method": "PUT", "path": "/customers/${2.id}", "body": {"status": "active"}} ] }

Solution

  1. Step 1: Identify correct operation order and referencing

    The customer creation is first (operation 1), so its ID is referenced as ${1.id} in subsequent operations.
  2. Step 2: Verify all references use ${1.id} and order is logical

    Orders and update use ${1.id} correctly. { "operations": [ {"method": "POST", "path": "/customers", "body": {"name": "Bob"}}, {"method": "POST", "path": "/orders", "body": {"customerId": "${1.id}", "item": "Laptop"}}, {"method": "POST", "path": "/orders", "body": {"customerId": "${1.id}", "item": "Mouse"}}, {"method": "PUT", "path": "/customers/${1.id}", "body": {"status": "active"}} ] } matches this perfectly. { "operations": [ {"method": "POST", "path": "/customers", "body": {"name": "Bob"}}, {"method": "POST", "path": "/orders", "body": {"customerId": "${2.id}", "item": "Laptop"}}, {"method": "POST", "path": "/orders", "body": {"customerId": "${2.id}", "item": "Mouse"}}, {"method": "PUT", "path": "/customers/${2.id}", "body": {"status": "active"}} ] } incorrectly uses ${2.id} which refers to the first order, not the customer.
  3. Final Answer:

    { "operations": [ {"method": "POST", "path": "/customers", "body": {"name": "Bob"}}, {"method": "POST", "path": "/orders", "body": {"customerId": "${1.id}", "item": "Laptop"}}, {"method": "POST", "path": "/orders", "body": {"customerId": "${1.id}", "item": "Mouse"}}, {"method": "PUT", "path": "/customers/${1.id}", "body": {"status": "active"}} ] } -> Option C
  4. Quick Check:

    Use ${1.id} to reference first operation's customer ID [OK]
Hint: Reference first created resource as ${1.id} in later operations [OK]
Common Mistakes:
  • Referencing wrong operation index for customer ID
  • Hardcoding IDs instead of referencing dynamically
  • Incorrect operation order breaking dependencies
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard