Почему изображение загружается через GET-запрос?

«Почему изображение загружается через GET-запрос?» — вопрос из категории Сети, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Изображения и другие статические ресурсы загружаются через HTTP GET, потому что этот метод является безопасным (safe) и идемпотентным (idempotent). Он предназначен только для получения данных и не должен изменять состояние сервера. Это фундаментальное свойство протокола HTTP, которое обеспечивает:

  1. Кеширование: Браузеры, прокси-серверы и CDN (например, CloudFront, Cloudflare) могут кешировать ответы на GET-запросы на основе заголовков (Cache-Control, ETag, Last-Modified), что drastically сокращает время загрузки для повторных посещений и снижает нагрузку на сервер.
  2. Предсказуемость и безопасность: GET-запросы можно безопасно повторять, перезагружать страницу, добавлять в закладки или делиться ссылкой без риска unintended side effects (в отличие от POST, который может привести к повторной покупке или созданию дубликата).
  3. Поддержка Range-запросов: Для больших файлов (например, видео) клиент может использовать заголовок Range в GET-запросе для докачки или потоковой передачи частей файла.

Пример обработки GET-запроса для изображения в Node.js (Express):

const express = require('express');
const app = express();

// Middleware для раздачи статических файлов (использует GET под капотом)
app.use('/static', express.static('public'));

// Или кастомный обработчик с настройкой кеширования
app.get('/images/:id', (req, res) => {
  const imageId = req.params.id;
  const imagePath = `./assets/${imageId}.jpg`;

  // Устанавливаем заголовки для кеширования на 1 день
  res.setHeader('Cache-Control', 'public, max-age=86400');
  res.sendFile(imagePath, { root: __dirname });
});