Курс по программированию на JavaScript
Урок 36: Введение в RESTful API
REST (Representational State Transfer) — это архитектурный стиль, который определяет набор ограничений для создания веб-сервисов. RESTful API — это интерфейс, который следует принципам REST и позволяет взаимодействовать с сервером через HTTP-запросы. В этом уроке мы рассмотрим основы RESTful API и научимся создавать простой REST API с использованием Node.js и Express.
Основы RESTful API
RESTful API использует стандартные HTTP-методы для выполнения операций с ресурсами:
- GET: Получение ресурса или списка ресурсов.
- POST: Создание нового ресурса.
- PUT: Обновление существующего ресурса.
- DELETE: Удаление ресурса.
Каждый ресурс в RESTful API идентифицируется уникальным URL. Например, URL /users может представлять коллекцию пользователей, а /users/1 — конкретного пользователя с идентификатором 1.
Создание простого REST API
Для создания RESTful API мы будем использовать Node.js и Express — минималистичный веб-фреймворк для Node.js. Начнем с установки необходимых пакетов:
// Установка Express
npm install express
// Пакет Express установлен
Теперь создадим файл app.js и напишем код для нашего RESTful API:
// app.js
const express = require('express');
const app = express();
const port = 3000;
app.use(express.json());
let users = [
{ id: 1, name: 'John Doe' },
{ id: 2, name: 'Jane Doe' }
];
// Получение всех пользователей
app.get('/users', (req, res) => {
res.json(users);
});
// Получение пользователя по ID
app.get('/users/:id', (req, res) => {
const user = users.find(u => u.id === parseInt(req.params.id));
if (!user) return res.status(404).send('User not found');
res.json(user);
});
// Создание нового пользователя
app.post('/users', (req, res) => {
const user = {
id: users.length + 1,
name: req.body.name
};
users.push(user);
res.status(201).json(user);
});
// Обновление пользователя по ID
app.put('/users/:id', (req, res) => {
const user = users.find(u => u.id === parseInt(req.params.id));
if (!user) return res.status(404).send('User not found');
user.name = req.body.name;
res.json(user);
});
// Удаление пользователя по ID
app.delete('/users/:id', (req, res) => {
const userIndex = users.findIndex(u => u.id === parseInt(req.params.id));
if (userIndex === -1) return res.status(404).send('User not found');
const deletedUser = users.splice(userIndex, 1);
res.json(deletedUser);
});
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});
// Сервер запущен на http://localhost:3000
Теперь запустите сервер, используя команду node app.js , и протестируйте API с помощью Postman или другого инструмента для отправки HTTP-запросов.
Упражнения
Упражнение 1: Добавление свойства email к пользователям
Добавьте свойство email к каждому пользователю и обновите все маршруты API для работы с этим свойством.
Решение:
// app.js (обновленный)
const express = require('express');
const app = express();
const port = 3000;
app.use(express.json());
let users = [
{ id: 1, name: 'John Doe', email: 'john@example.com' },
{ id: 2, name: 'Jane Doe', email: 'jane@example.com' }
];
// Получение всех пользователей
app.get('/users', (req, res) => {
res.json(users);
});
// Получение пользователя по ID
app.get('/users/:id', (req, res) => {
const user = users.find(u => u.id === parseInt(req.params.id));
if (!user) return res.status(404).send('User not found');
res.json(user);
});
// Создание нового пользователя
app.post('/users', (req, res) => {
const user = {
id: users.length + 1,
name: req.body.name,
email: req.body.email
};
users.push(user);
res.status(201).json(user);
});
// Обновление пользователя по ID
app.put('/users/:id', (req, res) => {
const user = users.find(u => u.id === parseInt(req.params.id));
if (!user) return res.status(404).send('User not found');
user.name = req.body.name;
user.email = req.body.email;
res.json(user);
});
// Удаление пользователя по ID
app.delete('/users/:id', (req, res) => {
const userIndex = users.findIndex(u => u.id === parseInt(req.params.id));
if (userIndex === -1) return res.status(404).send('User not found');
const deletedUser = users.splice(userIndex, 1);
res.json(deletedUser);
});
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});
// Сервер запущен на http://localhost:3000
Объяснение: Мы добавили свойство email к каждому пользователю и обновили все маршруты API для работы с этим свойством.
Упражнение 2: Валидация данных
Добавьте валидацию данных для маршрутов POST и PUT , чтобы имя и email пользователя были обязательными и email был корректным.
Решение:
// app.js (с валидацией)
const express = require('express');
const app = express();
const port = 3000;
app.use(express.json());
let users = [
{ id: 1, name: 'John Doe', email: 'john@example.com' },
{ id: 2, name: 'Jane Doe', email: 'jane@example.com' }
];
// Функция валидации email
const isValidEmail = (email) => {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return emailRegex.test(email);
};
// Получение всех пользователей
app.get('/users', (req, res) => {
res.json(users);
});
// Получение пользователя по ID
app.get('/users/:id', (req, res) => {
const user = users.find(u => u.id === parseInt(req.params.id));
if (!user) return res.status(404).send('User not found');
res.json(user);
});
// Создание нового пользователя
app.post('/users', (req, res) => {
const { name, email } = req.body;
if (!name || !email) {
return res.status(400).send('Name and email are required');
}
if (!isValidEmail(email)) {
return res.status(400).send('Invalid email format');
}
const user = {
id: users.length + 1,
name,
email
};
users.push(user);
res.status(201).json(user);
});
// Обновление пользователя по ID
app.put('/users/:id', (req, res) => {
const { name, email } = req.body;
if (!name || !email) {
return res.status(400).send('Name and email are required');
}
if (!isValidEmail(email)) {
return res.status(400).send('Invalid email format');
}
const user = users.find(u => u.id === parseInt(req.params.id));
if (!user) return res.status(404).send('User not found');
user.name = name;
user.email = email;
res.json(user);
});
// Удаление пользователя по ID
app.delete('/users/:id', (req, res) => {
const userIndex = users.findIndex(u => u.id === parseInt(req.params.id));
if (userIndex === -1) return res.status(404).send('User not found');
const deletedUser = users.splice(userIndex, 1);
res.json(deletedUser);
});
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});
// Сервер запущен на http://localhost:3000
Объяснение: Мы добавили валидацию данных для маршрутов POST и PUT , чтобы имя и email пользователя были обязательными, и email был корректным.
|