В чем разница между архитектурным стилем REST и REST API?

Ответ

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

Ключевые принципы REST:

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

REST API (или RESTful API) — это конкретная реализация этого архитектурного стиля. Это программный интерфейс (API), который следует принципам REST для взаимодействия между клиентом и сервером, как правило, через протокол HTTP.

Пример REST API эндпоинта в Go:

// Этот обработчик следует принципам REST:
// 1. Использует стандартный HTTP-метод (GET).
// 2. Ресурс идентифицируется через URI (например, /users/{id}).
// 3. Он stateless (не хранит состояние между вызовами).
func GetUserHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method != http.MethodGet {
        http.Error(w, "Метод не разрешен", http.StatusMethodNotAllowed)
        return
    }
    // ... логика получения пользователя по ID из r.URL.Path ...
    user := User{ID: "123", Name: "John Doe"}

    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(user)
}

Итог (аналогия):

  • REST — это как чертеж или свод строительных норм и правил. Он говорит, как строить.
  • REST API — это реальное здание, построенное по этому чертежу.

Ответ 18+ 🔞

Давай разберемся, что тут у нас за архитектурные пизделки, а то народ путается, как мудаки в тумане.

REST — это, блядь, не технология, а такой архитектурный стиль, свод правил, типа как устав в армии, только для распределенных систем. Он говорит, как компонентам общаться, чтобы не устроить бардак, блядь.

Основные его закидоны, ёпта:

  1. Клиент-сервер: Четкое разделение, сука. Один просит, другой дает. Как в столовой: ты — голодный клиент, а повар — сервер, который может и пиздюлиной накормить, если неправильно попросишь.
  2. Stateless (без состояния): Каждый запрос — это отдельная история, блядь. Сервер не должен помнить, кто ты и что ты у него в прошлый раз просил. Весь контекст — в самом запросе. Представь, будто ты каждый раз звонишь в справочную и начинаешь с "Алло, я Петя, скажите погоду", а они тебе каждый раз: "А ты кто? А, Петя. Погода — хуйня".
  3. Кэширование: Ответы можно кэшировать, чтобы не дергать сервер по пустякам. Типа, раз узнал курс доллара, запомнил на пять минут, а не спрашиваешь каждую секунду, как еблан.
  4. Единообразие интерфейса: Это святое, блядь! Все по стандарту: ресурсы — через URI, действия — через HTTP-методы (GET, POST, PUT, DELETE). Нельзя, сука, удалять пользователя методом GET, это пиздец какой-то.

REST API (или RESTful API) — это уже готовая, живая, ебаная реализация этих правил. Конкретный интерфейс, по которому твое приложение-клиент общается с сервером, используя HTTP как транспорт. Если REST — это теория, то RESTful API — это практика, в которой можно накосячить так, что мало не покажется.

Вот тебе пример на Go, как это должно выглядеть у нормальных пацанов:

// Этот обработчик — почти образец RESTful-поведения, если не считать, что я его на коленке писал.
// 1. Использует правильный HTTP-метод (GET) для получения данных.
// 2. Ресурс (юзер) четко идентифицирован в пути (/users/{id}).
// 3. Stateless как швейцарский нейтралитет — ни хуя не помнит.
func GetUserHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method != http.MethodGet {
        http.Error(w, "Иди нахуй со своим методом", http.StatusMethodNotAllowed)
        return
    }
    // ... тут логика, чтобы выдрать ID из r.URL.Path и найти юзера в базе ...
    user := User{ID: "123", Name: "Иваныч"}

    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(user) // Отправляем данные в формате JSON, как полагается.
}

Короче, итоговая аналогия, чтобы врубиться наконец:

  • REST — это сборник ГОСТов и СНиПов на строительство домов. Там написано, где несущие стены, а где хуй с горы можно пристроить.
  • REST API — это конкретная хрущевка или новостройка, которую по этим ГОСТам (или с пиздецовыми отступлениями от них) построили. В нее можно заселяться и жить, а можно обнаружить, что унитаз в подъезде, и охреневать.