Может ли REST API работать без протокола HTTP?

Ответ

Да, может. REST — это архитектурный стиль, а не протокол. Он определяет набор правил и ограничений для построения распределенных систем. Хотя HTTP является самым популярным протоколом для реализации REST API, это не является строгим требованием.

Принципы REST можно реализовать поверх любого протокола, который позволяет передавать и получать данные. Главное — соблюдать ключевые ограничения REST:

  • Клиент-серверная модель: Разделение ответственностей.
  • Отсутствие состояния (Stateless): Сервер не хранит состояние клиента между запросами.
  • Кэширование: Ответы сервера должны помечаться как кэшируемые или некэшируемые.
  • Единообразие интерфейса: Стандартизированный способ взаимодействия клиента и сервера.
  • Слоистая система: Клиент не знает, общается ли он напрямую с сервером или с промежуточными узлами (прокси, балансировщики).

HTTP так популярен, потому что его семантика (методы GET, POST, PUT, DELETE, статус-коды, заголовки) идеально ложится на принципы REST.

Пример REST-подобного взаимодействия через WebSockets:

// Клиент отправляет запрос в формате JSON
{
  "method": "GET",
  "resource": "/users/123",
  "requestId": "abc-123"
}

// Сервер обрабатывает и возвращает ответ
{
  "status": 200,
  "body": {"id": 123, "name": "Alice"},
  "inResponseTo": "abc-123"
}

Ответ 18+ 🔞

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

Можно и на чём угодно это развести, было бы желание. Главное — правила соблюсти, а то получится не REST, а пиздопроебибна какая-то. Правила вот эти:

  • Клиент-сервер: Чёткое разделение, кто просит, а кто даёт. Не путать роли, а то бардак.
  • Stateless (Без состояния): Сервер не должен помнить, кто ты и что ты хотел пять минут назад. Каждый запрос — как первый и последний. Идеально для забывчивых.
  • Кэширование: Надо помечать, что можно запомнить надолго, а что — нет. Чтобы не дергали по сто раз одно и то же, ресурсы же не резиновые.
  • Единый интерфейс: Чтобы всё по одному сценарию работало, а не «ой, тут у нас особый случай, блядь».
  • Слои: Клиенту похуй, с кем он на самом деле говорит — с сервером или с кучей прокси посередине. Его дело — запрос кинуть и ответ получить.

Вот и всё. HTTP просто очень удобная обёртка для этих принципов.

А теперь, чтобы мозги не закипели, смотри, как это могло бы выглядеть, если бы мы, например, через WebSockets такое же REST-подобное говно организовали:

// Клиент шлёт сообщение
{
  "method": "GET",
  "resource": "/users/123",
  "requestId": "abc-123"
}

// Сервер, подумав, отвечает
{
  "status": 200,
  "body": {"id": 123, "name": "Alice"},
  "inResponseTo": "abc-123"
}

Видишь? Та же логика, те же принципы, но протокол — другой. Всё дело в подходе, а не в транспортном слое. Главное — не выебываться и не называть REST'ом любую апишку, которая данные по сети шлёт.