Skip to content
📚
Backend Recipes

Building REST APIs

Beginner Lesson 1 of 1

Learn to design and implement professional REST APIs.

  • Stateless - Each request contains all needed information
  • Resource-based - URLs represent resources, not actions
  • HTTP Methods - Use GET, POST, PUT, PATCH, DELETE appropriately
  • Status Codes - Return meaningful HTTP status codes
const express = require('express');
const app = express();
app.use(express.json());
// In-memory data store
let users = [
{ id: 1, name: 'Alice', email: 'alice@example.com' },
{ id: 2, name: 'Bob', email: 'bob@example.com' },
];
// GET all users
app.get('/api/users', (req, res) => {
res.json(users);
});
// GET single user
app.get('/api/users/:id', (req, res) => {
const user = users.find(u => u.id === parseInt(req.params.id));
if (!user) return res.status(404).json({ error: 'User not found' });
res.json(user);
});
// POST create user
app.post('/api/users', (req, res) => {
const { name, email } = req.body;
if (!name || !email) {
return res.status(400).json({ error: 'Name and email required' });
}
const user = { id: users.length + 1, name, email };
users.push(user);
res.status(201).json(user);
});
// PUT update user
app.put('/api/users/:id', (req, res) => {
const user = users.find(u => u.id === parseInt(req.params.id));
if (!user) return res.status(404).json({ error: 'User not found' });
const { name, email } = req.body;
user.name = name || user.name;
user.email = email || user.email;
res.json(user);
});
// DELETE user
app.delete('/api/users/:id', (req, res) => {
const index = users.findIndex(u => u.id === parseInt(req.params.id));
if (index === -1) return res.status(404).json({ error: 'User not found' });
users.splice(index, 1);
res.status(204).send();
});
app.listen(3000, () => console.log('Server running on port 3000'));
from flask import Flask, jsonify, request
app = Flask(__name__)
users = [
{"id": 1, "name": "Alice", "email": "alice@example.com"},
{"id": 2, "name": "Bob", "email": "bob@example.com"},
]
@app.route('/api/users', methods=['GET'])
def get_users():
return jsonify(users)
@app.route('/api/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
user = next((u for u in users if u['id'] == user_id), None)
if not user:
return jsonify({"error": "User not found"}), 404
return jsonify(user)
@app.route('/api/users', methods=['POST'])
def create_user():
data = request.get_json()
user = {
"id": len(users) + 1,
"name": data['name'],
"email": data['email']
}
users.append(user)
return jsonify(user), 201
if __name__ == '__main__':
app.run(debug=True)
CodeMeaningUse Case
200OKSuccessful GET, PUT
201CreatedSuccessful POST
204No ContentSuccessful DELETE
400Bad RequestInvalid input
401UnauthorizedAuth required
403ForbiddenNo permission
404Not FoundResource missing
500Server ErrorInternal error