В чем разница между HTTP и REST?

Ответ

HTTP — это протокол прикладного уровня для передачи данных (например, гипертекста). REST (Representational State Transfer) — это архитектурный стиль (набор ограничений и принципов) для построения распределенных систем, который использует HTTP как протокол передачи.

Ключевые различия:

Аспект HTTP REST
Сущность Протокол (правила обмена сообщениями). Архитектурный стиль (способ проектирования).
Назначение Определяет методы (GET, POST), коды состояния, заголовки. Определяет, как использовать HTTP для построения API.
Состояние Сам по себе не определяет состояние приложения. Требует отсутствия состояния (stateless) на сервере: каждый запрос содержит всю необходимую контекстную информацию.

Принципы REST, накладываемые на HTTP:

  1. Единообразие интерфейса: Ресурсы идентифицируются URI, а операции над ними — стандартными HTTP-методами.
  2. Кэшируемость: Ответы должны явно указывать, можно ли их кэшировать.
  3. Слоистая система: Клиент не знает, общается ли он напрямую с сервером или через промежуточные узлы (прокси, балансировщики).
  4. Код по требованию (опционально): Сервер может передавать исполняемый код клиенту (например, JavaScript).

Пример RESTful-эндпоинта, использующего HTTP:

@RestController
@RequestMapping("/api/books")
public class BookController {
    // GET для получения ресурса
    @GetMapping("/{id}")
    public Book getBook(@PathVariable Long id) { ... } // HTTP GET /api/books/42

    // POST для создания нового ресурса
    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public Book createBook(@RequestBody Book book) { ... } // HTTP POST /api/books
}

Вывод: HTTP — это «как» передавать данные, а REST — «как» структурировать веб-сервис, используя возможности HTTP.

Ответ 18+ 🔞

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

Смотри, HTTP — это как правила дорожного движения, блядь. Там всё чётко: вот знак «СТОП» (это GET), вот «Уступи дорогу» (это POST), а вот «Объезд говна» (это, допустим, PUT). Протокол, сука, набор команд. Кинул запрос — получил ответ. Всё просто, как три копейки.

А REST — это уже не правила, а целая философия, как эти правила использовать, чтобы построить не пиздопроебибну, а нормальное, слоёное API. Это архитектурный стиль, понимаешь? Как проектировать эти самые дороги и развязки, чтобы не было потом «ой, а мы тут state на сервере храним, а клиент про него не знает, пиздец».

Ключевая разница, на которую все забивают хуй:

Штука HTTP REST
Что это? Протокол, инструкция. Философия, стиль, подход.
Зачем? Чтоб два компьютера могли друг другу «бульк-бульк» сказать. Чтоб твоё API было не сбродом методов, а системой ресурсов, с которой можно работать через тот же HTTP.
Состояние (State) Ему похуй. Он просто курьер. А вот тут, блядь, строжайший запрет! Stateless, ёпта! Каждый запрос — это независимая история, в нём вся инфа для сервера. Никаких сессий в памяти, «а помнишь, Вася, я тебе в прошлый раз…». Не помнит, сука, Вася!

REST накидывает на HTTP свои принципы, типа:

  1. Единый интерфейс. Ресурс (книга, пользователь, кот) — это URL. Действие с ним — это HTTP-метод. Хочешь получить книгу? GET на /books/42. Хочешь создать? POST на /books. Всё, блядь, логично, как день и ночь.
  2. Кэшируемость. Ответы должны кричать: «Меня можно закэшировать, я не изменюсь!» или «Не кэшируй меня, я каждый раз разный!». Чтобы не дергать сервер почём зря.
  3. Слои. Клиенту должно быть похуй, общается он напрямую с сервером или через десять проксей и балансировщиков. Его дело — кинуть запрос в правильный URL.

Вот смотри, как это в коде выглядит, без всякой ебли:

@RestController
@RequestMapping("/api/books")
public class BookController {

    // Хочешь книгу? На, получай! GET — для чтения.
    @GetMapping("/{id}")
    public Book getBook(@PathVariable Long id) { ... } // Запрос: GET /api/books/42

    // Создал новую книгу? Отправляй сюда! POST — для создания.
    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public Book createBook(@RequestBody Book book) { ... } // Запрос: POST /api/books
}

Видишь? HTTP-методы (GET, POST) — это инструменты. А REST — это правила, как этими инструментами пользоваться, чтобы построить связную, предсказуемую систему.

Вывод, блядь, простой: HTTP — это чем стучать (молоток, отвертка). А REST — это как и куда стучать, чтобы собрать табуретку, а не развалить весь дом к ебеням. Всё, вопрос закрыт, можно расходиться.