📖 Scenario: You are building a simple REST API for a bookstore. Users can request information about books by their ID. If a book is not found, the API should respond with a 404 Not Found error.
🎯 Goal: Create a REST API endpoint that returns book details by ID. If the book ID does not exist, return a 404 Not Found response with a clear message.
📋 What You'll Learn
Create a dictionary called books with exact book IDs and titles
Create a variable called requested_id with the ID to look up
Write code to check if requested_id is in books
If found, return the book title; if not, return a 404 Not Found message
Print the final response
💡 Why This Matters
🌍 Real World
APIs often need to tell users when requested data is missing. Returning a 404 Not Found status is a standard way to do this.
💼 Career
Understanding how to handle missing data and return proper error messages is essential for backend developers and API designers.
Progress0 / 4 steps
1
Create the books data
Create a dictionary called books with these exact entries: 1: 'The Great Gatsby', 2: '1984', 3: 'To Kill a Mockingbird'.
Rest API
Hint
Use curly braces to create a dictionary with integer keys and string values.
2
Set the requested book ID
Create a variable called requested_id and set it to 4 to simulate a user requesting a book that does not exist.
Rest API
Hint
Assign the number 4 to the variable requested_id.
3
Check if the book exists and prepare response
Write an if statement to check if requested_id is in books. If yes, create a variable response with the book title. Otherwise, set response to the string '404 Not Found: Book does not exist.'.
Rest API
Hint
Use if requested_id in books: to check existence, then assign response accordingly.
4
Print the response
Write a print statement to display the response variable.
Rest API
Hint
Use print(response) to show the message.
Practice
(1/5)
1. What does the HTTP status code 404 Not Found indicate in a REST API?
easy
A. The requested resource does not exist on the server.
B. The server has encountered an internal error.
C. The request was successful and data is returned.
D. The client is not authorized to access the resource.
Solution
Step 1: Understand HTTP status codes
HTTP status codes communicate the result of a client's request to the server.
Step 2: Identify meaning of 404
404 means the server cannot find the requested resource or URL.
Final Answer:
The requested resource does not exist on the server. -> Option A
Quick Check:
404 = Resource not found [OK]
Hint: 404 means resource missing, not server error [OK]
Common Mistakes:
Confusing 404 with 500 internal server error
Thinking 404 means unauthorized access
Assuming 404 means request succeeded
2. Which of the following is the correct way to send a 404 Not Found response in a REST API using HTTP headers?
easy
A. HTTP/1.1 403 Forbidden\r\nContent-Type: application/json\r\n\r\n
B. HTTP/1.1 200 OK\r\nContent-Type: application/json\r\n\r\n
C. HTTP/1.1 404 Not Found\r\nContent-Type: application/json\r\n\r\n
D. HTTP/1.1 500 Internal Server Error\r\nContent-Type: text/html\r\n\r\n
Solution
Step 1: Identify correct HTTP status line for 404
The status line must start with HTTP version and '404 Not Found' to indicate missing resource.
Step 2: Check headers format
Headers like Content-Type follow the status line, separated by CRLF, then a blank line before body.
Final Answer:
HTTP/1.1 404 Not Found\r\nContent-Type: application/json\r\n\r\n -> Option C
Quick Check:
Status line with 404 and proper headers = HTTP/1.1 404 Not Found\r\nContent-Type: application/json\r\n\r\n [OK]
Hint: 404 response starts with 'HTTP/1.1 404 Not Found' [OK]
Common Mistakes:
Using 200 OK status for missing resource
Mixing 404 with 500 or 403 status codes
Incorrect header formatting or missing blank line
3. Consider this Python Flask code snippet for a REST API endpoint:
from flask import Flask, jsonify, abort
app = Flask(__name__)
@app.route('/items/')
def get_item(item_id):
items = {1: 'apple', 2: 'banana'}
if item_id not in items:
abort(404)
return jsonify({'item': items[item_id]})
What will be the HTTP status code if a client requests /items/3?
medium
A. 404 Not Found
B. 200 OK
C. 500 Internal Server Error
D. 400 Bad Request
Solution
Step 1: Check if item_id 3 exists in items dictionary
Items only have keys 1 and 2, so 3 is missing.
Step 2: Understand abort(404) behavior
Calling abort(404) sends a 404 Not Found response to the client.
Final Answer:
404 Not Found -> Option A
Quick Check:
Missing item triggers abort(404) = 404 Not Found [OK]
Hint: abort(404) sends 404 status when resource missing [OK]
What is the problem with this code when a user is not found?
medium
A. It correctly sends a 404 status with no body.
B. It sends a 404 status but still sends undefined as response body.
C. It throws a syntax error due to missing semicolon.
D. It sends a 500 Internal Server Error automatically.
Solution
Step 1: Analyze response when user not found
res.status(404) sets status but does not end response or send body.
Step 2: Check what res.send(user) does
res.status(404) sets the status, but execution continues to res.send(undefined), which sends the string 'undefined' as body with 404 status.
Final Answer:
It sends a 404 status but still sends undefined as response body. -> Option B
Quick Check:
Missing res.send after status causes wrong response [OK]
Hint: Always send response body or end response after setting status [OK]
Common Mistakes:
Setting status without sending response body
Assuming status alone ends response
Not checking for undefined response body
5. You are designing a REST API for a library. When a client requests a book by ID that does not exist, you want to return a 404 Not Found with a helpful JSON message. Which of the following Express.js code snippets correctly implements this behavior?
hard
A. app.get('/books/:id', (req, res) => {
const books = {1: '1984', 2: 'Brave New World'};
const book = books[req.params.id];
if (!book) {
res.sendStatus(404);
}
res.json({book});
});
B. app.get('/books/:id', (req, res) => {
const books = {1: '1984', 2: 'Brave New World'};
const book = books[req.params.id];
if (!book) {
res.json({error: 'Book not found'});
}
res.status(404).json({book});
});
C. app.get('/books/:id', (req, res) => {
const books = {1: '1984', 2: 'Brave New World'};
const book = books[req.params.id];
if (!book) {
res.status(404);
}
res.json({book});
});
D. app.get('/books/:id', (req, res) => {
const books = {1: '1984', 2: 'Brave New World'};
const book = books[req.params.id];
if (!book) {
res.status(404).json({error: 'Book not found'});
return;
}
res.json({book});
});
Solution
Step 1: Check how 404 and message are sent
app.get('/books/:id', (req, res) => {
const books = {1: '1984', 2: 'Brave New World'};
const book = books[req.params.id];
if (!book) {
res.status(404).json({error: 'Book not found'});
return;
}
res.json({book});
}); sets status 404 and sends JSON with error message, then returns to avoid sending more.
Step 2: Verify other options
app.get('/books/:id', (req, res) => {
const books = {1: '1984', 2: 'Brave New World'};
const book = books[req.params.id];
if (!book) {
res.json({error: 'Book not found'});
}
res.status(404).json({book});
}); sends JSON without status 404 first, then tries to send 404 with book JSON (wrong order). app.get('/books/:id', (req, res) => {
const books = {1: '1984', 2: 'Brave New World'};
const book = books[req.params.id];
if (!book) {
res.status(404);
}
res.json({book});
}); sets status but does not send response properly. app.get('/books/:id', (req, res) => {
const books = {1: '1984', 2: 'Brave New World'};
const book = books[req.params.id];
if (!book) {
res.sendStatus(404);
}
res.json({book});
}); sends 404 status but then sends book JSON anyway.
Final Answer:
Sets status(404).json({error: 'Book not found'}); return; to send 404 with helpful JSON message and end response. -> Option D
Quick Check:
Set status, send JSON, and return to end response = app.get('/books/:id', (req, res) => {
const books = {1: '1984', 2: 'Brave New World'};
const book = books[req.params.id];
if (!book) {
res.status(404).json({error: 'Book not found'});
return;
}
res.json({book});
}); [OK]
Hint: Set status, send JSON error, and return immediately [OK]
Common Mistakes:
Not returning after sending 404 response
Sending response body after status without ending
Mixing order of status and response methods
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.