Backend Recipes
Building REST APIs
Building REST APIs
Section titled “Building REST APIs”Learn to design and implement professional REST APIs.
REST Principles
Section titled “REST Principles”- 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
Express.js REST API
Section titled “Express.js REST API”const express = require('express');const app = express();
app.use(express.json());
// In-memory data storelet users = [ { id: 1, name: 'Alice', email: 'alice@example.com' }, { id: 2, name: 'Bob', email: 'bob@example.com' },];
// GET all usersapp.get('/api/users', (req, res) => { res.json(users);});
// GET single userapp.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 userapp.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 userapp.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 userapp.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'));Python Flask REST API
Section titled “Python Flask REST API”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)HTTP Status Codes Reference
Section titled “HTTP Status Codes Reference”| Code | Meaning | Use Case |
|---|---|---|
| 200 | OK | Successful GET, PUT |
| 201 | Created | Successful POST |
| 204 | No Content | Successful DELETE |
| 400 | Bad Request | Invalid input |
| 401 | Unauthorized | Auth required |
| 403 | Forbidden | No permission |
| 404 | Not Found | Resource missing |
| 500 | Server Error | Internal error |