Модуль http Node.js
Node.jshttpЭтот модуль является одним из основных встроенных модулей Node.js. Он позволяет разработчикам создавать HTTP-серверы и клиенты. С помощью этого модуля мы можем легко обрабатывать HTTP-запросы и ответы, а также создавать веб-приложения или API-сервисы.
httpМодуль предоставляет возможность создавать серверы и выполнять HTTP-запросы, а также является основой для создания веб-приложений. Он поддерживает протокол HTTP/1.1 и предоставляет богатый API для обработки различных операций, связанных с HTTP.
Создание HTTP-сервера
ИспользуйтеhttpМодуль делает создание сервера очень простым. Ниже приведён базовый пример:
Пример
// Создать HTTP-сервер
const server = http.createServer((req, res) => {
// Установить заголовки ответа
res.writeHead(200, {'Content-Type': 'text/plain'});
// Отправить данные ответа
res.end('Hello, World!\n');
});
// Прослушивать порт 3000
server.listen(3000, () => {
console.log('Server running at http://localhost:3000/');
});
Объяснение кода
require('http')- Импортировать http-модуль Node.jshttp.createServer()- Создать экземпляр HTTP-сервера- Функция обратного вызова
(req, res) => {...}- Обрабатывать каждый HTTP-запросreq- Объект запроса, содержит информацию о запросе, отправленную клиентомres- Объект ответа, используется для отправки ответов клиенту
res.writeHead()- Установить заголовки ответаres.end()- Завершить ответ и отправить данныеserver.listen()- Запустить сервер и прослушивать указанный порт
Обработка HTTP-запросов
HTTP-сервер должен уметь обрабатывать разные типы запросов. Посмотрим, как разобрать информацию о запросе:
Пример
const server = http.createServer((req, res) => {
// Получить метод запроса, URL и заголовки запроса
const { method, url, headers } = req;
// Логировать информацию о запросе
console.log(`Получен ${method}запрос, путь: ${url}`);
console.log('Заголовки запроса:', headers);
// Обработка в зависимости от метода запроса
if (method === 'GET') {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Это GET-запрос\n');
} else if (method === 'POST') {
let body = '';
// Сбор данных POST
req.on('data', chunk => {
body += chunk;
});
// Приём данных завершён
req.on('end', () => {
console.log('Данные POST:', body);
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Данные получены\n');
});
} else {
res.writeHead(405, {'Content-Type': 'text/plain'});
res.end('Метод не разрешён\n');
}
});
server.listen(3000);
Общие свойства объекта запроса (req)
req.method: метод HTTP-запроса (GET, POST, PUT, DELETE и т. д.)req.url: URL-путь запросаreq.headers: объект заголовков запросаreq.httpVersion: версия протокола HTTP
Общие методы объекта ответа (res)
res.writeHead(statusCode, headers): Установить код состояния и заголовки ответаres.write(data): Записать тело ответаres.end([data]): Завершить ответ, при необходимости отправить окончательные данныеres.setHeader(name, value): Установить заголовки ответа
Выполнение HTTP-запросов
httpЭтот модуль может не только создавать серверы, но и выступать в роли клиента для выполнения HTTP-запросов:
Пример
// Выполнить GET-запрос
http.get('http://jsonplaceholder.typicode.com/posts/1', (res) => {
let data = '';
// Получить данные
res.on('data', (chunk) => {
data += chunk;
});
// Приём данных завершён
res.on('end', () => {
console.log('Данные ответа:', JSON.parse(data));
});
}).on('error', (err) => {
console.error('Ошибка запроса:', err);
});
Выполнение POST-запроса
Пример
// Параметры запроса
const options = {
hostname: 'jsonplaceholder.typicode.com',
port: 80,
path: '/posts',
method: 'POST',
headers: {
'Content-Type': 'application/json',
}
};
// Создать запрос
const req = http.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log('Ответ:', JSON.parse(data));
});
});
// Обработать ошибки
req.on('error', (err) => {
console.error('Ошибка запроса:', err);
});
// Записать данные запроса
const postData = JSON.stringify({
title: 'foo',
body: 'bar',
userId: 1
});
req.write(postData);
req.end();
Практические сценарии применения
1. Создание RESTful API
Пример
const server = http.createServer((req, res) => {
const { method, url } = req;
// Простая обработка маршрутов
if (method === 'GET' && url === '/api/users') {
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(JSON.stringify([{id: 1, name: 'Alice'}, {id: 2, name: 'Bob'}]));
} else if (method === 'POST' && url === '/api/users') {
let body = '';
req.on('data', chunk => body += chunk);
req.on('end', () => {
const newUser = JSON.parse(body);
// Здесь данные можно сохранить в базу данных
res.writeHead(201, {'Content-Type': 'application/json'});
res.end(JSON.stringify({id: Date.now(), ...newUser}));
});
} else {
res.writeHead(404, {'Content-Type': 'text/plain'});
res.end('Not Found\n');
}
});
server.listen(3000);
2. Прокси-сервер
Пример
const proxy = http.createServer((clientReq, clientRes) => {
// Выполнить запрос к целевому серверу
const options = {
hostname: 'example.com',
port: 80,
path: clientReq.url,
method: clientReq.method,
headers: clientReq.headers
};
const proxyReq = http.request(options, (proxyRes) => {
// Переслать ответ целевого сервера клиенту
clientRes.writeHead(proxyRes.statusCode, proxyRes.headers);
proxyRes.pipe(clientRes);
});
// Переслать тело запроса клиента
clientReq.pipe(proxyReq);
});
proxy.listen(8080);
Лучшие практики
- Обработка ошибок: Всегда обрабатывайте события ошибок в запросах и ответах
- Соображения по производительности: Для приложений с высокой конкурентностью рассмотрите использование пулов соединений
- Безопасность:
- Проверяйте все входные данные
- Установите соответствующие заголовки безопасности
- Ограничьте размер тела запроса, чтобы предотвратить DoS-атаки
- Используйте потоки: Для передачи больших файлов используйте потоковую передачу
- Рассмотрите фреймворки: Для сложных приложений рассмотрите использование таких фреймворков, как Express и Koa
Итог
Node.jshttpМодуль предоставляет базовую возможность для создания сетевых приложений. Хотя сейчас доступно множество более продвинутых фреймворков, пониманиеhttpпринципов работы этого модуля крайне важно для любого разработчика Node.js. Освоив этот основной модуль, вы сможете лучше понять, как работают веб-приложения, и сможете создавать собственные решения в соответствии с вашими потребностями.
Встроенные модули Node.js