Chapter 3: Backend API Development
Chapter 3 of 15
Chapter 3: Backend API Development
3.1 RESTful API Design
RESTful APIs follow conventions that make them predictable and easy to use.
REST Principles:
- Use HTTP methods correctly (GET, POST, PUT, DELETE, PATCH)
- Use resource-based URLs
- Return appropriate HTTP status codes
- Use JSON for data exchange
- Version your API
// RESTful routes
GET /api/v1/users // List all users
GET /api/v1/users/:id // Get specific user
POST /api/v1/users // Create user
PUT /api/v1/users/:id // Update entire user
PATCH /api/v1/users/:id // Partial update
DELETE /api/v1/users/:id // Delete user
// Express implementation
const express = require('express');
const router = express.Router();
router.get('/users', getUsers);
router.get('/users/:id', getUser);
router.post('/users', createUser);
router.put('/users/:id', updateUser);
router.patch('/users/:id', patchUser);
router.delete('/users/:id', deleteUser);
3.2 API Response Format
// Consistent response format
function sendSuccess(res, data, statusCode = 200) {
res.status(statusCode).json({
success: true,
data: data
});
}
function sendError(res, message, statusCode = 400) {
res.status(statusCode).json({
success: false,
error: {
message: message,
code: statusCode
}
});
}
// Usage
app.get('/users/:id', async (req, res) => {
try {
const user = await User.findById(req.params.id);
if (!user) {
return sendError(res, 'User not found', 404);
}
sendSuccess(res, user);
} catch (error) {
sendError(res, error.message, 500);
}
});
3.3 API Documentation
// Using Swagger/OpenAPI
const swaggerJsdoc = require('swagger-jsdoc');
const swaggerUi = require('swagger-ui-express');
const swaggerOptions = {
definition: {
openapi: '3.0.0',
info: {
title: 'My API',
version: '1.0.0'
}
},
apis: ['./routes/*.js']
};
const swaggerSpec = swaggerJsdoc(swaggerOptions);
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));