Модуль http Node.js

Java FileВстроенные модули Node.js


Node.jshttpЭтот модуль является одним из основных встроенных модулей Node.js. Он позволяет разработчикам создавать HTTP-серверы и клиенты. С помощью этого модуля мы можем легко обрабатывать HTTP-запросы и ответы, а также создавать веб-приложения или API-сервисы.

httpМодуль предоставляет возможность создавать серверы и выполнять HTTP-запросы, а также является основой для создания веб-приложений. Он поддерживает протокол HTTP/1.1 и предоставляет богатый API для обработки различных операций, связанных с HTTP.


Создание HTTP-сервера

ИспользуйтеhttpМодуль делает создание сервера очень простым. Ниже приведён базовый пример:

Пример

const http = require('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/');
});

Объяснение кода

  1. require('http')- Импортировать http-модуль Node.js
  2. http.createServer()- Создать экземпляр HTTP-сервера
  3. Функция обратного вызова(req, res) => {...}- Обрабатывать каждый HTTP-запрос
    • req- Объект запроса, содержит информацию о запросе, отправленную клиентом
    • res- Объект ответа, используется для отправки ответов клиенту
  4. res.writeHead()- Установить заголовки ответа
  5. res.end()- Завершить ответ и отправить данные
  6. server.listen()- Запустить сервер и прослушивать указанный порт

Обработка HTTP-запросов

HTTP-сервер должен уметь обрабатывать разные типы запросов. Посмотрим, как разобрать информацию о запросе:

Пример

const http = require('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-запросов:

Пример

const http = require('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 http = require('http');

// Параметры запроса
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 http = require('http');

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 http = require('http');

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);

Лучшие практики

  1. Обработка ошибок: Всегда обрабатывайте события ошибок в запросах и ответах
  2. Соображения по производительности: Для приложений с высокой конкурентностью рассмотрите использование пулов соединений
  3. Безопасность:
    • Проверяйте все входные данные
    • Установите соответствующие заголовки безопасности
    • Ограничьте размер тела запроса, чтобы предотвратить DoS-атаки
  4. Используйте потоки: Для передачи больших файлов используйте потоковую передачу
  5. Рассмотрите фреймворки: Для сложных приложений рассмотрите использование таких фреймворков, как Express и Koa

Итог

Node.jshttpМодуль предоставляет базовую возможность для создания сетевых приложений. Хотя сейчас доступно множество более продвинутых фреймворков, пониманиеhttpпринципов работы этого модуля крайне важно для любого разработчика Node.js. Освоив этот основной модуль, вы сможете лучше понять, как работают веб-приложения, и сможете создавать собственные решения в соответствии с вашими потребностями.

Java FileВстроенные модули Node.js

Другие расширения