Что такое протокол HTTP?

Ответ

HTTP (HyperText Transfer Protocol) — это протокол прикладного уровня, основанный на модели "запрос-ответ" (client-server), используемый для передачи гипермедиа-документов (например, HTML). Он является фундаментальной основой для обмена данными во Всемирной паутине (WWW).

Ключевые характеристики:

  • Текстовый (в основном): Заголовки и метаданные передаются в виде текста, что удобно для отладки.
  • Не сохраняющий состояние (Stateless): Каждый запрос обрабатывается сервером независимо от предыдущих. Состояние сессии поддерживается на уровне приложения (например, с помощью cookies, токенов).
  • Работает поверх TCP/IP: Устанавливается TCP-соединение (обычно на порт 80 для HTTP, 443 для HTTPS), по которому передаются HTTP-сообщения.

Структура HTTP-запроса:

GET /api/v1/users?active=true HTTP/1.1          // Стартовая строка (метод, путь, версия)
Host: api.example.com                           // Заголовки (Headers)
User-Agent: Mozilla/5.0
Accept: application/json
Authorization: Bearer eyJhbGci...

// Тело запроса (Body) - отсутствует для GET, есть для POST/PUT
Основные методы (HTTP Verbs): Метод Идемпотентен* Безопасен** Назначение
GET Да Да Получение данных с сервера.
POST Нет Нет Создание нового ресурса или запуск процесса.
PUT Да Нет Полное обновление ресурса (создание, если не существует).
PATCH Нет Нет Частичное обновление ресурса.
DELETE Да Нет Удаление ресурса.

Идемпотентность: Многократное выполнение одного и того же запроса дает тот же результат, что и однократное. *Безопасность: Метод не должен изменять состояние сервера.

Структура HTTP-ответа:

HTTP/1.1 200 OK                                 // Статусная строка (версия, код, фраза)
Content-Type: application/json; charset=utf-8   // Заголовки
Cache-Control: max-age=3600
Date: Mon, 23 Jan 2023 10:00:00 GMT
Content-Length: 42

{"status": "success", "data": {}}            // Тело ответа (Response Body)

Классы статус-кодов:

  • 1xx (Информационные): Запрос принят, обработка продолжается.
  • 2xx (Успех): Запрос успешно обработан (200 OK, 201 Created, 204 No Content).
  • 3xx (Перенаправление): Для завершения запроса требуются дальнейшие действия (301 Moved Permanently, 304 Not Modified).
  • 4xx (Ошибка клиента): Запрос содержит ошибку (400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found).
  • 5xx (Ошибка сервера): Сервер не смог выполнить корректный запрос (500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable).

HTTPS — это HTTP поверх защищённого транспортного уровня TLS/SSL, который обеспечивает шифрование и аутентификацию.

Ответ 18+ 🔞

Давай я тебе про HTTP расскажу, а то смотрю, ты как Герасим из той истории — молчишь, а в глазах вопрос: "Мууу?". Ну, блядь, слушай сюда, но не молчи, а то закиплю, как чайник.

Вот представь, весь интернет — это огромный, блядь, бар. Ты — клиент, подходишь к стойке (это сервер) и говоришь: "Дай мне пива!" (это запрос). А бармен тебе в ответ: "На, держи, свежее" (это ответ). Вот и весь, сука, HTTP — HyperText Transfer Protocol, протокол для пересылки этих самых "пивных" документов, типа HTML-страниц.

Чем он, блядь, характерен?

  • Текстовый, в основном: Все эти заголовки, команды — они как записка, текстовая. Удобно, если что-то пошло не так — посмотрел и сразу: "А, тут опечатка, блядь, 'Hots' вместо 'Host'!".
  • Без состояния (Stateless): Это как общаться с золотой рыбкой, у которой память — три секунды. Каждый твой новый запрос для сервера — первый. "Дай пива!" — "На". "Дай ещё!" — "А ты кто такой? А, ну на". Чтобы он тебя запомнил, надо ему в каждый запрос печеньку (cookie) или пропуск (токен) сувать.
  • Ездит на TCP/IP: Это как почта. Сначала устанавливается соединение (звонок по телефону — TCP handshake), а потом по этому каналу уже кричат: "GET /index.html!".

Вот как выглядит твой крик в бар (HTTP-запрос):

GET /api/v1/users?active=true HTTP/1.1          // Кричишь: "Эй, дай список активных юзеров, по протоколу 1.1!"
Host: api.example.com                           // Говоришь, в какой именно бар идешь
User-Agent: Mozilla/5.0                         // Представляешься: "Я — Firefox, версии 5.0!"
Accept: application/json                        // Уточняешь: "Только в JSON-бутылках, пожалуйста!"
Authorization: Bearer eyJhbGci...               // Показываешь пропуск (токен)

// Тело запроса — это если ты не просто просишь, а передаешь что-то, например, анкету нового пользователя. Для GET его обычно нет.

А теперь основные команды, которыми ты орешь (HTTP Methods):

Метод Идемпотентен* Безопасен** Что делает
GET Да Да Спрашивает: "Дай мне посмотреть на этот ресурс!". Ничего не трогает.
POST Нет Нет Кричит: "Создай что-то новое по этим данным!" или "Запусти этот процесс!".
PUT Да Нет Требует: "Вот тебе полный новый образ ресурса, замени старый на этот!".
PATCH Нет Нет Вежливо просит: "Сделай вот такие точечные правки в ресурсе, пожалуйста".
DELETE Да Нет Приказывает: "Удали этот ресурс нахуй!".

Идемпотентность — это когда ты десять раз крикнешь "УДАЛИ!" на один и тот же ресурс, и результат будет как от одного крика (ресурс удален). С POST так не выйдет — десять раз "СОЗДАЙ!" создаст десять копий, ёпта! *Безопасность — это про то, что метод не должен менять состояние сервера. GET — безопасный, он только смотрит. DELETE — небезопасный, он рушит.

А вот как бармен (сервер) тебе отвечает (HTTP-ответ):

HTTP/1.1 200 OK                                 // "Всё чётко, братан, держи!"
Content-Type: application/json; charset=utf-8   // "Вот, в JSON-бутылке, кодировка utf-8"
Cache-Control: max-age=3600                     // "Запомни ответ на час, чтобы не дергаться"
Date: Mon, 23 Jan 2023 10:00:00 GMT            // "Время отправки"
Content-Length: 42                              // "Размер посылки — 42 байта"

{"status": "success", "data": {}}            // А вот и само "пиво" — тело ответа!

И самое важное — коды ответов, ёбта! Это как интонация бармена:

  • 1xx (Информационные, 100 Continue): "Подожди секунду, я тебя услышал, думаю..."
  • 2xx (Успех):
    • 200 OK: "На, держи, всё окей".
    • 201 Created: "Ты просил создать — я создал, вот тебе адрес нового".
    • 204 No Content: "Всё сделал, но тебе назад ничего отдавать не буду (типа, удалил)".
  • 3xx (Перенаправление):
    • 301 Moved Permanently: "Мы, блядь, переехали на новый адрес, иди туда".
    • 304 Not Modified: "У тебя в кэше уже свежая версия, бери оттуда, не буду трафик зря гонять".
  • 4xx (Ошибка на твоей стороне, клиент):
    • 400 Bad Request: "Ты какой-то хуйню прислал в запросе, я не понял".
    • 401 Unauthorized: "А пропуск (логин/пароль/токен) где, сука? Не пущу!".
    • 403 Forbidden: "Пропуск есть, но в этот зал тебе доступ закрыт".
    • 404 Not Found: "Такого ресурса у нас нет, иди нахуй". Классика, в рот меня чих-пых!
  • 5xx (Ошибка на стороне сервера):
    • 500 Internal Server Error: "У меня тут внутри всё ебнулось, сам не знаю почему".
    • 502 Bad Gateway: "Я как прокси пытался спросить у другого сервиса, а он мне какую-то дичь ответил".
    • 503 Service Unavailable: "Я перегружен, подожди, или иди в другой бар".

А HTTPS — это когда весь этот разговор в баре происходит не просто так, а в отдельной, блядь, звукоизолированной кабинке с шифрованием. Чтобы никто посторонний не подслушал, что ты там запрашиваешь и что тебе бармен отвечает. Надежная штука, без неё сейчас вообще никуда.

Вот и вся, по сути, магия. Не так страшен чёрт, как его малюют. Главное — не путать методы и понимать, что тебе в ответ пришло: "200 OK" или "418 I'm a teapot".